﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports Commander_Wars.Spieletools
Imports System
''' <summary>
''' Führt einen Angriff aus und zeigt ihn bei Animationen an.
''' </summary>
''' <remarks></remarks>
Public Class ObjektAngriff
    Public Shared ProzentualeSternAuffüllung As Integer = 1000
    Dim Start As Boolean = False
    Dim Angreifer As ObjektEinheit
    Dim AngreiferX As Integer
    Dim AngreiferY As Integer
    Dim Verteidiger As ObjektEinheit
    Dim VerteidigerX As Integer
    Dim VerteidigerY As Integer
    Dim VerteidigerLandschaft As ObjektLandschaft
    Dim AngreiferWaffe() As Single = {}
    Dim VerteidigerWaffe() As Single = {}
    Dim neuesVerteidigerLeben As Single
    Dim neuesAngreiferLeben As Single
    Dim MaxFrames As Integer = 0
    Dim Fernkampf As Boolean
    Dim AngreiferSchaden As Single = 0
    Dim VerteidigerSchaden As Single = 0
    Dim Kampfende As Boolean = False
    Dim Kampfani As KampfAnimation
    Public Sub New(ByVal neuAngreiferX As Integer, ByVal neuAngreiferY As Integer, ByVal AngreiferLandschaft As ObjektLandschaft, ByVal neuVerteidigerX As Integer, ByVal neuVerteidigerY As Integer, ByVal Fernkampf As Boolean, ByVal neuAngreiferWaffe As Single(), ByVal neuVerteidigerWaffe As Single(), Optional ByVal KeineAnimationen As Boolean = False)
        Start = False
        Select Case My.Settings.CommanderWarsGameMoodus
            Case CommanderWarsGameModi.AdvanceWars
                ProzentualeSternAuffüllung = 900
            Case CommanderWarsGameModi.AdvanceWars2
                ProzentualeSternAuffüllung = 900
            Case CommanderWarsGameModi.AdvanceWarsDS
                ProzentualeSternAuffüllung = 800
            Case CommanderWarsGameModi.CommanderWars2
                ProzentualeSternAuffüllung = 750
            Case Else
                ProzentualeSternAuffüllung = 1000
        End Select

        'wir schreiben die Variablen in die Werte geschrieben
        Me.Fernkampf = Fernkampf
        AngreiferX = neuAngreiferX
        AngreiferY = neuAngreiferY
        Angreifer = Objektverwalter.Spielfeld.Einheiten(AngreiferX, AngreiferY, ObjektSpielfeld.Bodenschlacht)
        If IsNothing(Angreifer) Then
            Angreifer = Objektverwalter.Spielfeld.AktuelleEinheit
        End If
        AngreiferWaffe = neuAngreiferWaffe
        VerteidigerX = neuVerteidigerX
        VerteidigerY = neuVerteidigerY
        Verteidiger = Objektverwalter.Spielfeld.Einheiten(VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld.MomentaneSchlacht)
        VerteidigerWaffe = neuVerteidigerWaffe
        Objektverwalter.Spielfeld.AngriffsAnzeige = Nothing
        Objektverwalter.Spielfeld.EingabenErlauben = False
        Objektverwalter.Spielfeld.KIPause = True
        'Wir setzen das neue Leben von Angreifer und Verteidiger fest
        If IsNothing(Verteidiger) = False Then
            neuesVerteidigerLeben = Verteidiger.Leben - AngreiferWaffe(0)
            If neuesVerteidigerLeben < 0 Then
                neuesVerteidigerLeben = 0
            End If
            neuesAngreiferLeben = Angreifer.Leben
            'wir legen den Verteidiger Schaden fest
            VerteidigerSchaden = Verteidiger.Leben - neuesVerteidigerLeben
            'So falls der Angreifer eine Raub stärke hat wird im Geld gegeben
            If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Geldraub > 0 Then
                If Angreifer.GetSpieler.KOS(0).IsInKOZone(Angreifer) Then
                    Dim Geld As Integer = Verteidiger.Kosten * Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).Teurungsrate(Verteidiger, VerteidigerX, VerteidigerY) / 10 * getKP(Verteidiger.Leben - neuesVerteidigerLeben) * Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Geldraub
                    Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).AddFonds(Geld)
                End If
            End If
            'Falls der Verteidiger eine Geld für Schaden bekommt erhält er dieses jetzt
            If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).GeldFürEigenSchaden > 0 Then
                If Verteidiger.GetSpieler.KOS(0).IsInKOZone(VerteidigerX, VerteidigerY) Then
                    Dim Geld As Integer = Verteidiger.Kosten * Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).Teurungsrate(Verteidiger, VerteidigerX, VerteidigerY) / 10 * getKP(Verteidiger.Leben - neuesVerteidigerLeben) * Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).GeldFürEigenSchaden
                    Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).AddFonds(Geld)
                End If
            End If
            If Fernkampf = False And IsNothing(VerteidigerWaffe) = False Then
                If VerteidigerWaffe(0) >= 0 Then
                    neuesAngreiferLeben = Angreifer.Leben - VerteidigerWaffe(0)
                Else
                    neuesAngreiferLeben = Angreifer.Leben
                End If
                If neuesAngreiferLeben < 0 Then
                    neuesAngreiferLeben = 0
                End If
                'Wir setzen den Angreiferschaden fest
                AngreiferSchaden = Angreifer.Leben - neuesAngreiferLeben
                'So falls der Verteidiger eine Raubstärke hat wird sie eingesetzt
                If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Geldraub > 0 Then
                    Dim Geld As Integer = Angreifer.Kosten * Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).Teurungsrate(Angreifer, AngreiferX, AngreiferY) / 10 * getKP(Angreifer.Leben - neuesAngreiferLeben) * Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Geldraub
                    Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).AddFonds(Geld)
                End If


            End If
            'Wir ziehen dem Verteidiger Munition ab.
            If IsNothing(VerteidigerWaffe) = False Then
                If VerteidigerWaffe(1) = 2 Then
                    Verteidiger.Munition = -1
                End If
            End If
        Else
            'Wir wählen die Landschaft oder Gebäude mit Leben aus
            VerteidigerLandschaft = Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, ObjektSpielfeld.Bodenschlacht)
        End If
        'Falls wir mit der zweiten Waffe angreifen wird die Munition verringert
        If AngreiferWaffe(1) = 2 Then
            Objektverwalter.Spielfeld.AktuelleEinheit.Munition = -1
        End If
        'wir würden gegen ein Gebäude Kämpfen da gibt es keine Sprites
        If IsNothing(Verteidiger) Then
            MaxFrames = -1
            Kampfende = True
        ElseIf My.Settings.KampfAnimationen = True And KeineAnimationen = False Then
            Kampfani = New KampfAnimation(Angreifer, Verteidiger, AngreiferSchaden, VerteidigerSchaden, Fernkampf)
        Else
            Kampfende = True
        End If

        If My.Settings.draw3D Then
            Dim APos As Point
            If Objektverwalter.Spielfeld.Laufen Is Nothing Then
                APos = New Point(AngreiferX, AngreiferY)
            Else
                APos = Objektverwalter.Spielfeld.Laufen.Position
            End If
            Angreifer.SetOrientation(APos, New Point(VerteidigerX, VerteidigerY))
            If Verteidiger IsNot Nothing Then
                Verteidiger.SetOrientation(APos)
            End If
            'Na dann können die Einheiten ja jetzt anfangen zu kämpfen.
            Angreifer.SetAnimation("Attack")
            Angreifer.SetFolgeAnimation("Attack")
            If Not Verteidiger Is Nothing Then
                Verteidiger.SetAnimation("Attack")
                Verteidiger.SetFolgeAnimation("Attack")
            End If
        End If
        Start = True
    End Sub

    Public Function Malen() As Boolean
        If Hauptmenü.Aufzeichnungsspulen Then
            Return True
        Else
            If Start = True Then
                Grafikengine.szfScale = Nothing

                If Kampfende = False Then
                    Kampfende = Kampfani.Malen
                End If

                If Kampfende = True Then
                    Return True
                End If
            End If
        End If
    End Function
    Public Sub AngriffEnde()
        If My.Settings.draw3D Then
            'Die Einheiten können jetzt aufhören zu kämpfen.
            Angreifer.AnimationAktuallisieren()
            If Verteidiger IsNot Nothing Then
                Verteidiger.AnimationAktuallisieren()
            End If
        End If
        If Start = True Then
            'wir ziehen dem Verteidiger das Leben ab.
            If IsNothing(Verteidiger) Then
                If IsNothing(VerteidigerLandschaft.Gebäude) Then
                    VerteidigerLandschaft.Leben = -AngreiferWaffe(0)
                    If VerteidigerLandschaft.Leben <= 0 Then
                        'Die Landschaft wurde zerstört
                        Dim Explosion As String = "Land"
                        Dim Landschaft As ObjektLandschaft = Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld.MomentaneSchlacht)
                        'ein Meteor Plasma kaputt machen
                        If Landschaft.LandschaftsID = "METEOR" Then
                            LandschaftsTexturMeteor.DestroyPlasma(Landschaft.KooX, Landschaft.KooY)
                        End If
                        Dim NeuLandschaft As String = Landschaft.WirdZu
                        Select Case NeuLandschaft.ToUpper
                            Case "EBENE"
                                NeuLandschaft += "+SCHROTT"
                            Case "WÜSTE"
                                NeuLandschaft += "+SCHROTT"
                            Case "SCHNEE"
                                NeuLandschaft += "+SCHROTT"
                        End Select
                        Objektverwalter.NeuObjektAnimation(New Point(VerteidigerX, VerteidigerY), Explosion, Objektverwalter.Spielfeld.MomentaneSchlacht)
                        Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld.MomentaneSchlacht) = New ObjektLandschaft(NeuLandschaft, VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld, )
                    End If
                Else
                    VerteidigerLandschaft = Objektverwalter.Spielfeld.Landschaften(VerteidigerLandschaft.Gebäude.Rechteck.X, VerteidigerLandschaft.Gebäude.Rechteck.Y, Objektverwalter.Spielfeld.MomentaneSchlacht)
                    VerteidigerLandschaft.Gebäude.KP -= AngreiferWaffe(0)
                    If VerteidigerLandschaft.Gebäude.KP <= 0 Then
                        Dim X As Integer = Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude.Rechteck.X
                        Dim Y As Integer = Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude.Rechteck.Y
                        'Wir haben das Gebäude zerstört
                        'Die Landschaft wurde zerstört
                        Dim Explosion As String = "Land"

                        Objektverwalter.NeuObjektAnimation(New Point(X, Y), Explosion, Objektverwalter.Spielfeld.MomentaneSchlacht, True)
                        'wir erstellen die Landschaft die jetzt erscheint.
                        Dim D(,) As Integer = VerteidigerLandschaft.Gebäude.Verweisgebäude
                        Dim ID As String = VerteidigerLandschaft.LandschaftsID + "+SCHROTT"
                        If VerteidigerLandschaft.LandschaftsID.Contains("+") = True Then
                            ID = VerteidigerLandschaft.LandschaftsID
                        End If
                        For I = 0 To D.GetLength(0) - 1
                            If Objektverwalter.Spielfeld.Landschaften(X + D(I, 0), Y + D(I, 1), Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude.GetRealGebäudeID = "VERWEIS" Then
                                Objektverwalter.Spielfeld.Landschaften(X + D(I, 0), Y + D(I, 1), Objektverwalter.Spielfeld.MomentaneSchlacht).Gebäude = Nothing
                                Objektverwalter.Spielfeld.Landschaften(X + D(I, 0), Y + D(I, 1), Objektverwalter.Spielfeld.MomentaneSchlacht) = New ObjektLandschaft(ID, X + D(I, 0), Y + D(I, 1), Objektverwalter.Spielfeld, )
                            End If
                        Next
                        Objektverwalter.Spielfeld.Landschaften(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = New ObjektLandschaft(ID, VerteidigerX, VerteidigerY, Objektverwalter.Spielfeld, )
                    End If
                End If

            Else
                'Aufzeichnungen abspeichern!
                Objektverwalter.Spielfeld.Aufzeichnung.UpdateAngriff(AngreiferWaffe(0), Angreifer.Spieler)
                'Muaha
                Verteidiger.Leben = neuesVerteidigerLeben
                'Der Gegner schießt zurück bzw. wir bekommen Leben zurück
                Angreifer.Leben = neuesAngreiferLeben
                If Verteidiger.Leben < 0 Then
                    Verteidiger.Leben = 0
                End If
                'Der Lebensentzug des Angreifers wirkt
                If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                    Angreifer.IncreaseLeben(VerteidigerSchaden * Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Lebensentzug)
                End If
                'Manche KOS haben die Fähigkeit Gegner daran zu hindern sich zu heilen
                If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).ReperaturVerbotNachKampf = True Then
                    If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                        Verteidiger.KannReapariertWerden = False
                    End If
                End If
                'Manche Spieler erhalten Geld für Schaden an eigenen Truppen.
                'Falls der Angreifer eine Geld für Schaden bekommt erhält er dieses jetzt
                If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).GeldFürEigenSchaden > 0 Then
                    If Verteidiger.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                        Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).AddFonds(Verteidiger.Kosten * VerteidigerSchaden * Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).GeldFürEigenSchaden)
                    End If
                End If
                'So jetzt berechnen wir die Gabeleisten auffüllung
                Dim SternSchaden As Single = VerteidigerSchaden
                GabeleistenAuffüllen(SternSchaden)
                If Verteidiger.Leben > 0 Then
                    If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).RadioaktiveStärke.Y < VerteidigerSchaden And Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).RadioaktiveStärke.X <> 0 Then
                        If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                            'Die Radioaktive Seuche wird übertragen
                            Dim RadioZahl As Integer = Math.DivRem(CInt(VerteidigerSchaden), Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).RadioaktiveStärke.Y, 0)
                            Verteidiger.IncreaseRadioaktiveVerseuchung(RadioZahl * Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).RadioaktiveStärke.X)
                        End If
                    End If
                    If Fernkampf = False Then
                        'Falls der Angreifer eine Geld für Schaden bekommt erhält er dieses jetzt
                        If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).GeldFürEigenSchaden > 0 Then
                            If Verteidiger.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                                Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).AddFonds(Angreifer.Kosten * AngreiferSchaden * Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).GeldFürEigenSchaden)
                            End If
                        End If
                        'Aber zuvor erhält er noch KP mit Lebensentzug
                        If Verteidiger.GetSpieler.KOS(0).IsInKOZone(VerteidigerX, VerteidigerY) Then
                            Verteidiger.IncreaseLeben(AngreiferSchaden * Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Lebensentzug)
                        End If
                        'Wenn der Verteidiger noch lebt kann es sein das er wegfliegt.
                        If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Schadensflug.X <= AngreiferWaffe(0) Then
                            If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                                Schadensflug(Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Schadensflug.Y, Verteidiger, True)
                            End If
                        End If
                    End If
                End If
                'Falls wir einen gewissen Schaden überschreiten kann sich unser Feind nicht mehr bewegen.
                If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Lähmschaden * 10 >= Verteidiger.Leben Then
                    If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                        Verteidiger.HatsichBewegt = True
                    End If
                End If


                'Falls der Verteidiger kein Leben mehr hat wird er zerstört
                If Verteidiger.Leben <= 0 Then
                    Verteidiger.GetSpieler.RemoveEinheit(Verteidiger)
                    'Haben wir die KO Einheit zerstört?
                    Dim S As ObjektSpieler = Verteidiger.GetSpieler
                    If Not S.KOS(0).GetKOEinheit Is Nothing Then
                        If Verteidiger.EinheitenStufe = ObjektEinheit.Stufe.KO Then
                            S.KOS(0).SetKOEinheit(Nothing)
                        End If
                    End If
                    'Die Einheit steigt im Rang auf.
                    If Objektverwalter.Spielfeld.Regeln.LevelModus = True Then
                        Angreifer.EinheitenStufe = 1
                    End If
                    'Manche KOs setzen die Bewegungspunkte nach Zerstörung auf einen Wert für eine Runde.
                    If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                        Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).BewegungspunkteFestlegen(VerteidigerX, VerteidigerY)
                    End If
                    'Manche KOs haben den Vorteil durch Zerstörung andere Truppen zu verbessern.
                    If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).AnyUnitKampfverstärker.X <> 0 Or Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).AnyUnitKampfverstärker.Y <> 0 Then
                        If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                            Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).IncreaseAnyUnitATKandMovementPointsNachZerstörung()
                        End If
                    End If
                    'Wir erleiden Schaden
                    If Verteidiger.GetSpieler.KOS(0).IsInKOZone(VerteidigerX, VerteidigerY) Then
                        Angreifer.DoDamage(Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).KampfSchadenHeilung)
                    End If
                    'unsere Deffensive und Offensive steigt
                    If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                        Angreifer.ATKDEFBoost.Y += Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).ATKDEFBoostdurchZerstörung.Y
                        Angreifer.ATKDEFBoost.X += Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).ATKDEFBoostdurchZerstörung.X
                    End If
                    'Und die ausgewählte Einheit darf warten auf ihre Zerstörung. Haha
                    UnitDestroyed(Verteidiger.Spieler, Angreifer.Spieler)
                    Objektverwalter.NeuObjektAnimation(Verteidiger.X, Verteidiger.Y)
                    'So hier wurde die Besetzungszahl bereits Reseted jetzt können wir sie senken falls der KO so eine Fähigkeit hat.
                    If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).BesetzungsbonusNachEinheitenZerstörung < 0 Then
                        If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                            Dim Gebäude As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(Verteidiger.X, Verteidiger.Y, ObjektSpielfeld.Bodenschlacht).Gebäude
                            If Not Gebäude Is Nothing Then
                                If Gebäude.Besetzung > 0 Then
                                    Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).AddBonusgebäude(New Point(VerteidigerX, VerteidigerY))
                                End If
                            End If
                        End If
                    End If
                ElseIf IsNothing(VerteidigerWaffe) = False Then
                    'wir ziehen dem Angreifer Leben ab.
                    If VerteidigerWaffe(0) >= 0 Then
                        'Der Lebensentzug des Angreifers wirkt
                        If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                            Verteidiger.IncreaseLeben(AngreiferSchaden * Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Lebensentzug)
                        End If
                        'und er erhält auch noch ein paar TP zurück.
                        If Verteidiger.GetSpieler.KOS(0).IsInKOZone(VerteidigerX, VerteidigerY) Then
                            Verteidiger.DoDamage(-Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).KampfSchadenHeilung)
                        End If
                        If Angreifer.Leben > 0 Then
                            If Fernkampf = False Then
                                If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Schadensflug.X <= VerteidigerWaffe(0) Then
                                    If Verteidiger.GetSpieler.KOS(0).IsInKOZone(VerteidigerX, VerteidigerY) Then
                                        Schadensflug(Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Schadensflug.Y, Angreifer, False)
                                    End If
                                End If
                            End If
                        End If
                        If Angreifer.Leben <= 0 Then
                            Angreifer.GetSpieler.RemoveEinheit(Angreifer)
                            'Ist der Angreifer KO zerstört?
                            Dim S As ObjektSpieler = Angreifer.GetSpieler
                            If Not S.KOS(0).GetKOEinheit Is Nothing Then
                                If Angreifer.EinheitenStufe = ObjektEinheit.Stufe.KO Then
                                    S.KOS(0).SetKOEinheit(Nothing)
                                End If
                            End If

                            'Die Einheit steigt im Rang auf.
                            If Objektverwalter.Spielfeld.Regeln.LevelModus = True Then
                                Verteidiger.EinheitenStufe = 1
                            End If
                            'So hier wurde die Besetzungszahl bereits Reseted jetzt können wir sie senken falls der KO so eine Fähigkeit hat.
                            If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).BesetzungsbonusNachEinheitenZerstörung < 0 Then
                                If Verteidiger.GetSpieler.KOS(0).IsInKOZone(VerteidigerX, VerteidigerY) Then
                                    Dim Gebäude As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(AngreiferX, AngreiferY, ObjektSpielfeld.Bodenschlacht).Gebäude
                                    If Not Gebäude Is Nothing Then
                                        If Gebäude.Besetzung > 0 Then
                                            Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).AddBonusgebäude(New Point(AngreiferX, AngreiferY))
                                        End If
                                    End If
                                End If
                            End If
                            'Manche KOs setzen die Bewegungspunkte nach Zerstörung auf einen Wert für eine Runde.
                            Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).BewegungspunkteFestlegen(AngreiferX, AngreiferY)
                            'wir reisen unseren Gegner in den Tod.
                            If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                                Verteidiger.DoDamage(Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).KampfSchadenHeilung)
                            End If
                            'Wir wurden zerstört und Boom
                            UnitDestroyed(Angreifer.Spieler, Verteidiger.Spieler)
                            Objektverwalter.NeuObjektAnimation(AngreiferX, AngreiferY)

                            If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                                Objektverwalter.Spielfeld.EingabenErlauben = True
                                ObjektMaus.Visible = True
                            End If
                            Objektverwalter.Spielfeld.KIPause = False
                            Objektverwalter.Spielfeld.AktuelleEinheitPosition = Nothing
                            Objektverwalter.Spielfeld.Wegsuchsystem = Nothing
                            Objektverwalter.Spielfeld.AktuelleEinheitPfeil = Nothing
                            Objektverwalter.Spielfeld.AktuelleEinheitHatGefeuert = False
                            Objektverwalter.Spielfeld.Sichterstellen()
                            Dim M As ObjektSpielMenü = Objektverwalter.Menü
                            M.Spielmodus = ObjektSpielMenü.Spielmodi.Nichts

                            Exit Sub
                        Else
                            Angreifer.DoDamage(-Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).KampfSchadenHeilung)
                            If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).RadioaktiveStärke.Y < AngreiferSchaden And Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).RadioaktiveStärke.X <> 0 Then
                                If Verteidiger.GetSpieler.KOS(0).IsInKOZone(VerteidigerX, VerteidigerY) Then
                                    'Die Radioaktive Seuche wird übertragen
                                    Dim RadioZahl As Integer = Math.DivRem(CInt(AngreiferSchaden), Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).RadioaktiveStärke.Y, 0)
                                    Verteidiger.IncreaseRadioaktiveVerseuchung(RadioZahl * Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).RadioaktiveStärke.X)
                                End If
                            End If
                        End If
                        Objektverwalter.Spielfeld.AktuelleEinheit = Angreifer
                        Objektverwalter.Spielfeld.Einheiten(VerteidigerX, VerteidigerY, ObjektSpielfeld.Bodenschlacht) = Verteidiger
                    End If
                End If
            End If
            If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).NochMalZiehenUndKampfänderNachZerstörung <> 0 And neuesVerteidigerLeben <= 0 Then
                'Wir haben einen Feind zerstört und können deshalb nochmal ziehen.
                If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                    Objektverwalter.Spielfeld.AktuelleEinheit.ATKDEFBoost.X += Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).NochMalZiehenUndKampfänderNachZerstörung
                    Objektverwalter.WartenOhneHatSichBewegt()
                Else
                    Objektverwalter.Warten()
                End If
            Else
                Objektverwalter.Warten()
            End If
            If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                Objektverwalter.Spielfeld.EingabenErlauben = True
                ObjektMaus.Visible = True
            End If
            Objektverwalter.Spielfeld.KIPause = False

        End If
    End Sub
    ''' <summary>
    ''' So wird die Gabeleiste der Einheiten gefüllt
    ''' </summary>
    ''' <param name="Schaden"></param>
    ''' <remarks></remarks>
    Public Sub GabeleistenAuffüllen(ByVal Schaden As Single)
        Select Case My.Settings.CommanderWarsGameMoodus
            Case CommanderWarsGameModi.AdvanceWarsDS
                ProzentualeSternAuffüllung = 6
            Case CommanderWarsGameModi.AdvanceWars2, CommanderWarsGameModi.AdvanceWars
                ProzentualeSternAuffüllung = 9
            Case Else
                ProzentualeSternAuffüllung = 15
        End Select
        Select Case My.Settings.CommanderWarsGameMoodus
            Case CommanderWarsGameModi.AdvanceWarsDC
                'Angreifer Balken aufladen
                If Angreifer.GetSpieler.KOS(0).IsInKOZone(AngreiferX, AngreiferY) Then
                    If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).VeränderteWerte.KeinGabeFortschritt = False Then
                        If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).Gabeleiste = True Then
                            If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
                                Dim GabeVoll As ObjektKO.Gabemodi = ObjektKO.Gabemodi.Keine
                                If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KannSpezialGabe = True Then
                                    GabeVoll = ObjektKO.Gabemodi.Spezialgabe
                                ElseIf Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KannGabe = True Then
                                    GabeVoll = ObjektKO.Gabemodi.Gabe
                                End If
                                Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Gabeleiste = Math.DivRem(CInt(Schaden), 10, 0) * 100
                                Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).PlayGabeFüllMusik(GabeVoll)
                            End If
                        End If
                    End If
                End If
                'Verteidger Leiste auffüllen
                If Verteidiger.GetSpieler.KOS(0).IsInKOZone(VerteidigerX, VerteidigerY) Then
                    If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).VeränderteWerte.KeinGabeFortschritt = False Then
                        If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).Gabeleiste = True Then
                            If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
                                Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Gabeleiste = Math.DivRem(CInt(AngreiferSchaden), 10, 0) * 100
                            End If
                        End If
                    End If
                End If
            Case CommanderWarsGameModi.CommanderWars2
                Dim Sternbonus As Integer = Schaden / 100 * (Verteidiger.Kosten * Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).Teurungsrate(Verteidiger, VerteidigerX, VerteidigerY)) / ProzentualeSternAuffüllung
                If Verteidiger.GetSpieler.KOS(0).GetKOEinheit IsNot Nothing Then
                    'Jetzt werden die Gabeleisten gefüllt ,aber nur wenn der KO nicht gerade seine Gabe bzw. Spezialgabe einsetzt
                    If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).VeränderteWerte.KeinGabeFortschritt = False Then
                        If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).Gabeleiste = True Then
                            If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
                                Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Gabeleiste = Sternbonus
                            End If
                            If IsNothing(Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(1)) = False Then
                                If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(1).Gabemodus = ObjektKO.Gabemodi.Keine Then
                                    Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(1).Gabeleiste = Sternbonus / 2
                                End If
                            End If
                        End If
                    End If
                End If
                If Angreifer.GetSpieler.KOS(0).GetKOEinheit IsNot Nothing Then
                    If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).VeränderteWerte.KeinGabeFortschritt = False Then
                        If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).Gabeleiste = True Then
                            If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
                                Dim GabeVoll As ObjektKO.Gabemodi = ObjektKO.Gabemodi.Keine
                                If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KannSpezialGabe = True Then
                                    GabeVoll = ObjektKO.Gabemodi.Spezialgabe
                                ElseIf Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KannGabe = True Then
                                    GabeVoll = ObjektKO.Gabemodi.Gabe
                                End If
                                Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Gabeleiste = Sternbonus / 2
                                Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).PlayGabeFüllMusik(GabeVoll)
                            End If
                            If IsNothing(Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(1)) = False Then
                                If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(1).Gabemodus = ObjektKO.Gabemodi.Keine Then
                                    Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(1).Gabeleiste = Sternbonus / 4
                                End If
                            End If
                        End If
                    End If
                End If
            Case Else
                Dim Sternbonus As Integer = Schaden / 100 * (Verteidiger.Kosten * Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).Teurungsrate(Verteidiger, VerteidigerX, VerteidigerY)) / ProzentualeSternAuffüllung
                'Jetzt werden die Gabeleisten gefüllt ,aber nur wenn der KO nicht gerade seine Gabe bzw. Spezialgabe einsetzt
                If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).VeränderteWerte.KeinGabeFortschritt = False Then
                    If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).Gabeleiste = True Then
                        If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
                            Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(0).Gabeleiste = Sternbonus
                        End If
                        If IsNothing(Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(1)) = False Then
                            If Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(1).Gabemodus = ObjektKO.Gabemodi.Keine Then
                                Objektverwalter.Spielfeld.Spieler(Verteidiger.Spieler).KOS(1).Gabeleiste = Sternbonus / 2
                            End If
                        End If
                    End If
                End If
                If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).VeränderteWerte.KeinGabeFortschritt = False Then
                    If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).Gabeleiste = True Then
                        If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
                            Dim GabeVoll As ObjektKO.Gabemodi = ObjektKO.Gabemodi.Keine
                            If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KannSpezialGabe = True Then
                                GabeVoll = ObjektKO.Gabemodi.Spezialgabe
                            ElseIf Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KannGabe = True Then
                                GabeVoll = ObjektKO.Gabemodi.Gabe
                            End If
                            Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).Gabeleiste = Sternbonus / 2
                            Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(0).PlayGabeFüllMusik(GabeVoll)
                        End If
                        If IsNothing(Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(1)) = False Then
                            If Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(1).Gabemodus = ObjektKO.Gabemodi.Keine Then
                                Objektverwalter.Spielfeld.Spieler(Angreifer.Spieler).KOS(1).Gabeleiste = Sternbonus / 4
                            End If
                        End If
                    End If
                End If
        End Select
    End Sub
    ''' <summary>
    ''' Lässt den Gegner wegfliegen und richtet evtl. Schaden an.
    ''' </summary>
    ''' <param name="Felder"></param>
    ''' <param name="Einheit"></param>
    ''' <param name="VerteidigerFlug"></param>
    ''' <remarks></remarks>
    Private Sub Schadensflug(ByVal Felder As Integer, ByRef Einheit As ObjektEinheit, ByVal VerteidigerFlug As Boolean)
        If Felder > 0 Then
            Dim EinheitenPosition As New Point(AngreiferX, AngreiferY)
            Dim X As Integer = AngreiferX - VerteidigerX
            Dim Y As Integer = AngreiferY - VerteidigerY
            If VerteidigerFlug = True Then
                X = VerteidigerX - AngreiferX
                Y = VerteidigerY - AngreiferY
                EinheitenPosition = New Point(VerteidigerX, VerteidigerY)
                Objektverwalter.Spielfeld.Einheiten(VerteidigerX, VerteidigerY, ObjektSpielfeld.Bodenschlacht) = Nothing
            End If
            Dim Richtung As New Point
            If Math.Abs(X) > Math.Abs(Y) Then
                Richtung.X = X
            Else
                Richtung.Y = Y
            End If
            For I = 1 To Felder
                If Objektverwalter.Spielfeld.OnMap(EinheitenPosition.X + Richtung.X, EinheitenPosition.Y + Richtung.Y) = True Then
                    If Einheit.CanMoveOverTile(EinheitenPosition.X + Richtung.X, EinheitenPosition.Y + Richtung.Y, ObjektSpielfeld.Bodenschlacht) = True And Objektverwalter.Spielfeld.Einheiten(EinheitenPosition.X + Richtung.X, EinheitenPosition.Y + Richtung.Y, ObjektSpielfeld.Bodenschlacht) Is Nothing Then
                        EinheitenPosition.X += Richtung.X
                        EinheitenPosition.Y += Richtung.Y
                    Else
                        SchadensflugSchaden(Felder, Einheit, VerteidigerFlug, EinheitenPosition, I)
                        Exit For
                    End If
                Else
                     SchadensflugSchaden(Felder, Einheit, VerteidigerFlug, EinheitenPosition, I)
                    Exit For
                End If
                'Schade kein Lebensabzug
                If I = Felder Then
                    If VerteidigerFlug = True Then
                        VerteidigerX = EinheitenPosition.X
                        VerteidigerY = EinheitenPosition.Y
                    Else
                        AngreiferX = EinheitenPosition.X
                        AngreiferY = EinheitenPosition.Y
                        Objektverwalter.Spielfeld.AktuelleEinheitPosition = New Point(AngreiferX, AngreiferY)
                        If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                            Objektverwalter.Spielfeld.Laufen.Position = New Point(AngreiferX, AngreiferY)
                        End If
                    End If
                End If
            Next
        End If
    End Sub
    Private Sub SchadensflugSchaden(ByVal Felder As Integer, ByRef Einheit As ObjektEinheit, ByVal VerteidigerFlug As Boolean, ByVal EinheitenPosition As Point, ByVal I As Integer)
        Dim Schaden As Integer = Felder - I + 1
        If Einheit.Leben - Schaden * 10 <= 0 Then
            Einheit.Leben = 1
        Else
            Einheit.Leben -= Schaden * 10
        End If
        neuesVerteidigerLeben = Einheit.Leben
        If VerteidigerFlug = True Then
            If Schaden > 0 Then
                If Einheit.Besetzen Then
                    If VerteidigerX <> EinheitenPosition.X Or VerteidigerY <> EinheitenPosition.Y Then
                        Einheit.Besetzen = False
                        Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Einheit.GetMap).Gebäude.Besetzung = 20
                    End If
                End If
                Einheit.GetSpieler.RemoveEinheit(Einheit, ObjektSpieler.ExternGezogeneEinheit.Befehle.Heilen)
            End If
            VerteidigerX = EinheitenPosition.X
            VerteidigerY = EinheitenPosition.Y
            Einheit.X = VerteidigerX
            Einheit.Y = VerteidigerY
        Else
            If Schaden > 0 Then
                If Einheit.Besetzen Then
                    If AngreiferX <> EinheitenPosition.X Or AngreiferY <> EinheitenPosition.Y Then
                        Einheit.Besetzen = False
                        Objektverwalter.Spielfeld.Landschaften(AngreiferX, AngreiferY, Einheit.GetMap).Gebäude.Besetzung = 20
                    End If
                End If
                Einheit.GetSpieler.RemoveEinheit(Einheit, ObjektSpieler.ExternGezogeneEinheit.Befehle.Heilen)
            End If
            AngreiferX = EinheitenPosition.X
            AngreiferY = EinheitenPosition.Y
            Einheit.X = AngreiferX
            Einheit.Y = AngreiferY
            Objektverwalter.Spielfeld.AktuelleEinheitPosition = New Point(AngreiferX, AngreiferY)
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                Objektverwalter.Spielfeld.Laufen.Position = New Point(AngreiferX, AngreiferY)
            End If
        End If

    End Sub
    ''' <summary>
    ''' Wir haben eine Einheit zerstört Aufzeichnen!
    ''' </summary>
    ''' <param name="LooserPlayer"></param>
    ''' <param name="DestroyerPlayer"></param>
    ''' <remarks></remarks>
    Public Sub UnitDestroyed(ByVal LooserPlayer As Integer, ByVal DestroyerPlayer As Integer)
        Objektverwalter.Spielfeld.Aufzeichnung.DestroyedUnits(DestroyerPlayer - 1) += 1
        Objektverwalter.Spielfeld.Aufzeichnung.LostUnits(LooserPlayer - 1) += 1
    End Sub
End Class
''' <summary>
''' Stellt die Kampfgrafiken zur Verfügung
''' </summary>
''' <remarks></remarks>
Public Class KampfGrafiken
    Const MaxStyles As Integer = 0
    Private Shared ScreenFlash(0) As Texture
    Private Shared Gestartet As Boolean = False
    Private Shared Luft(MaxStyles, 1) As Texture
    Private Shared Wald(MaxStyles, 1) As Texture
    Private Shared Ebene(MaxStyles, 2) As Texture
    Private Shared Straße(MaxStyles) As Texture
    Private Shared Berg(MaxStyles) As Texture
    Private Shared Gebäude(MaxStyles, 4) As Texture
    Private Shared Brücke(MaxStyles) As Texture
    Private Shared See(MaxStyles) As Texture
    Private Shared Strand(MaxStyles) As Texture
    Private Shared Fluss(MaxStyles) As Texture
    Private Shared Pipeline(MaxStyles) As Texture
    ''Transparency over efficieny. Alas
    Private Shared BackWald(MaxStyles, 1) As Texture
    Private Shared BackEbene(MaxStyles) As Texture
    Private Shared BackStraße(MaxStyles) As Texture
    Private Shared BackBerg(MaxStyles, 1) As Texture
    Private Shared BackGebäude(MaxStyles, 4) As Texture
    Private Shared BackBrücke(MaxStyles) As Texture
    Private Shared BackSee(MaxStyles) As Texture
    Private Shared BackStrand(MaxStyles) As Texture
    Private Shared BackFluss(MaxStyles) As Texture

    Private Shared HQ(MaxStyles, 11) As Texture
    Private Shared BackHQ(MaxStyles, 11) As Texture

    Private Shared SonstigeTexturen(3) As Texture

    Enum Kampfanimation
        Rakete
        RaketenRauch
        Bomben
        Bazooka
    End Enum
    ''' <summary>
    ''' Texturen von Waffen die gemalt werden können.
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared WaffenTexturen(3) As Texture
    Public Sub New()
        If My.Settings.CommanderWarsGameMoodus <> CommanderWarsGameModi.FireEmblem Then
            If Gestartet = False Then
                LoadTextures()
                LoadWaffenAnimationen()
            End If
            Gestartet = True
        End If
    End Sub
    Private Shared Sub LoadTextures()
        ScreenFlash(0) = Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "KampfHintergründe\ScreenFlah.bmp")
        SonstigeTexturen(0) = Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "KampfHintergründe\KampfanimationHinten.png")
        SonstigeTexturen(1) = Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "KampfHintergründe\KampfanimationVorne.png")
        SonstigeTexturen(2) = Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "KampfHintergründe\ButtonRund.png")
        SonstigeTexturen(3) = Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "KampfHintergründe\ButtonRundVorne.png")
        For I = 0 To MaxStyles
            Luft(I, 0) = Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "KampfHintergründe\Luft+" + I.ToString + ".png")
            Luft(I, 1) = Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "KampfHintergründe\Wald+" + I.ToString + ".png")
            'untere Teile
            'Wald
            Dim B As Bitmap = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\Wald+" + I.ToString + "+A.png")
            Wald(I, 0) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\Wald+" + I.ToString + "+B.png")
            Wald(I, 1) = Grafikengine.LoadTexture(B)
            'Ebene
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\Ebene+" + I.ToString + "+A.png")
            Ebene(I, 0) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\Ebene+" + I.ToString + "+B.png")
            Ebene(I, 1) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\Ebene+" + I.ToString + "+C.png")
            Ebene(I, 2) = Grafikengine.LoadTexture(B)
            'Straße
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\Straße+" + I.ToString + ".png")
            Straße(I) = Grafikengine.LoadTexture(B)
            'Gebäude
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\STADT+" + I.ToString + "+A.png")
            Gebäude(I, 0) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\STADT+" + I.ToString + "+B.png")
            Gebäude(I, 1) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\Basis+" + I.ToString + ".png")
            Gebäude(I, 2) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\Flughafen+" + I.ToString + ".png")
            Gebäude(I, 3) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\Werft+" + I.ToString + ".png")
            Gebäude(I, 4) = Grafikengine.LoadTexture(B)
            'Berg
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\Berg+" + I.ToString + ".png")
            Berg(I) = Grafikengine.LoadTexture(B)
            'Brücke
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\Brücke+" + I.ToString + ".png")
            Brücke(I) = Grafikengine.LoadTexture(B)
            'See
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\See+" + I.ToString + ".png")
            See(I) = Grafikengine.LoadTexture(B)
            'Fluss
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\Fluss+" + I.ToString + ".png")
            Fluss(I) = Grafikengine.LoadTexture(B)
            'Strand
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\Strand+" + I.ToString + ".png")
            Strand(I) = Grafikengine.LoadTexture(B)

            'Pipeline
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\Pipeline+" + I.ToString + ".png")
            Pipeline(I) = Grafikengine.LoadTexture(B)
            'Oberere Teile
            'Wald
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\Wald+" + I.ToString + "+A.png")
            BackWald(I, 0) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\Wald+" + I.ToString + "+B.png")
            BackWald(I, 1) = Grafikengine.LoadTexture(B)
            'Ebene
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\EBENE+" + I.ToString + ".png")
            BackEbene(I) = Grafikengine.LoadTexture(B)
            'Straße
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\Straße+" + I.ToString + ".png")
            BackStraße(I) = Grafikengine.LoadTexture(B)
            'Gebäude
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\STADT+" + I.ToString + "+A.png")
            BackGebäude(I, 0) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\STADT+" + I.ToString + "+B.png")
            BackGebäude(I, 1) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\Basis+" + I.ToString + ".png")
            BackGebäude(I, 2) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\Flughafen+" + I.ToString + ".png")
            BackGebäude(I, 3) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\Werft+" + I.ToString + ".png")
            BackGebäude(I, 4) = Grafikengine.LoadTexture(B)
            'Berg
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\Berg+" + I.ToString + "+A.png")
            BackBerg(I, 0) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\Berg+" + I.ToString + "+B.png")
            BackBerg(I, 1) = Grafikengine.LoadTexture(B)
            'Brücke
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\Brücke+" + I.ToString + ".png")
            BackBrücke(I) = Grafikengine.LoadTexture(B)
            'See
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\See+" + I.ToString + ".png")
            BackSee(I) = Grafikengine.LoadTexture(B)
            'Strand
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\Strand+" + I.ToString + ".png")
            BackStrand(I) = Grafikengine.LoadTexture(B)
            'Fluss
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\Fluss+" + I.ToString + ".png")
            BackFluss(I) = Grafikengine.LoadTexture(B)

            'HQ's
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\HQ+OS+" + I.ToString + ".png")
            HQ(I, 0) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\HQ+BM+" + I.ToString + ".png")
            HQ(I, 1) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\HQ+GE+" + I.ToString + ".png")
            HQ(I, 2) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\HQ+YC+" + I.ToString + ".png")
            HQ(I, 3) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\HQ+BH+" + I.ToString + ".png")
            HQ(I, 4) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\HQ+OS+" + I.ToString + ".png")
            HQ(I, 5) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\HQ+OS+" + I.ToString + ".png")
            HQ(I, 6) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\HQ+OS+" + I.ToString + ".png")
            HQ(I, 7) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\HQ+OS+" + I.ToString + ".png")
            HQ(I, 8) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\HQ+OS+" + I.ToString + ".png")
            HQ(I, 9) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\HQ+OS+" + I.ToString + ".png")
            HQ(I, 10) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\UntererHintergrund\HQ+OS+" + I.ToString + ".png")
            HQ(I, 11) = Grafikengine.LoadTexture(B)

            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\HQ+OS+" + I.ToString + ".png")
            BackHQ(I, 0) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\HQ+BM+" + I.ToString + ".png")
            BackHQ(I, 1) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\HQ+GE+" + I.ToString + ".png")
            BackHQ(I, 2) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\HQ+YC+" + I.ToString + ".png")
            BackHQ(I, 3) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\HQ+BH+" + I.ToString + ".png")
            BackHQ(I, 4) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\HQ+OS+" + I.ToString + ".png")
            BackHQ(I, 5) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\HQ+OS+" + I.ToString + ".png")
            BackHQ(I, 6) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\HQ+OS+" + I.ToString + ".png")
            BackHQ(I, 7) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\HQ+OS+" + I.ToString + ".png")
            BackHQ(I, 8) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\HQ+OS+" + I.ToString + ".png")
            BackHQ(I, 9) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\HQ+OS+" + I.ToString + ".png")
            BackHQ(I, 10) = Grafikengine.LoadTexture(B)
            B = Image.FromFile(My.Settings.Resourcenpfad + "KampfHintergründe\ObererHintergrund\HQ+OS+" + I.ToString + ".png")
            BackHQ(I, 11) = Grafikengine.LoadTexture(B)

        Next


    End Sub
    Private Shared Sub LoadWaffenAnimationen()
        Dim B As Bitmap = Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\WaffenAnimationen\Rakete.png")
        WaffenTexturen(0) = Grafikengine.LoadTexture(B)
        B = Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\WaffenAnimationen\RaketenstartRauch.png")
        WaffenTexturen(1) = Grafikengine.LoadTexture(B)
        WaffenTexturen(2) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\WaffenAnimationen\Bomben.png"))
        WaffenTexturen(3) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Einheiten\WaffenAnimationen\Bazooka.png"))

    End Sub
    Public Shared Function getSky(ByVal Style As Integer, ByVal Landschaft As ObjektLandschaft) As Texture
        If Landschaft.getID = "WALD" Or Landschaft.getID = "KAKTEEN" Or Landschaft.getID = "KIEFERN" Then
            Return Luft(Style, 1)
        Else
            Return Luft(Style, 0)
        End If
    End Function
    Public Shared Function GetAirSky(ByVal Style As Integer)
        Return Luft(Style, 0)
    End Function
    Public Shared Function getPlainBack(ByVal attacker As ObjektEinheit, ByVal defender As ObjektEinheit, ByVal style As Integer) As Texture
        Dim atkTerrain As ObjektLandschaft = attacker.GetTerrain
        Dim defTerrain As ObjektLandschaft = defender.GetTerrain
        Dim orientation As Integer = orient(attacker.GetLocation, defender.GetLocation)
        Select Case orientation
            Case 0 'north
                If Objektverwalter.Spielfeld.OnMap(attacker.X, attacker.Y + 1) Then
                    Return getBackDrop(Objektverwalter.Spielfeld.Landschaften(attacker.X, attacker.Y + 1, attacker.GetMap), 0)
                End If
            Case 1 'west
                If Objektverwalter.Spielfeld.OnMap(attacker.X + 1, attacker.Y) Then
                    Return getBackDrop(Objektverwalter.Spielfeld.Landschaften(attacker.X + 1, attacker.Y, attacker.GetMap), 0)
                End If
            Case 2 'south
                If Objektverwalter.Spielfeld.OnMap(attacker.X, attacker.Y - 1) Then
                    Return getBackDrop(Objektverwalter.Spielfeld.Landschaften(attacker.X, attacker.Y - 1, attacker.GetMap), 0)
                End If
            Case 3 ' east
                If Objektverwalter.Spielfeld.OnMap(attacker.X - 1, attacker.Y) Then
                    Return getBackDrop(Objektverwalter.Spielfeld.Landschaften(attacker.X - 1, attacker.Y, attacker.GetMap), 0)
                End If
            Case Else
                Return BackWald(style, 0) ' // if the angle isn't orthogonal, use wood.'
        End Select
        Return BackWald(style, 0)
    End Function
    ''' <summary>
    ''' 0=Nord
    ''' 1=West
    ''' 2=Süd
    ''' 3=Ost
    ''' </summary>
    ''' <param name="P1"></param>
    ''' <param name="P2"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function orient(ByVal P1 As Point, ByVal P2 As Point) As Integer

        '//Expect this to be upgraded later
        Dim dir As Integer = 0
        '//same location? -1!
        If P1.X = P2.X And P1.Y = P2.Y Then Return -1

        If P1.X = P2.X Then
            If P1.Y > P2.Y Then '//If this is below, otherwise, above
                Return 1
            Else
                Return 3
            End If
        ElseIf P1.Y = P2.Y Then

            If P1.X > P2.X Then ' //If this is below, otherwise, above
                Return 0
            Else
                Return 2
            End If
        Else
            Return -1
        End If
    End Function
    ''' <summary>
    ''' Gibt den Hintergrund einer Landschaft weiter hinten zurück.
    ''' </summary>
    ''' <param name="t"></param>
    ''' <param name="Style"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function getBackDrop(ByVal t As ObjektLandschaft, ByVal Style As Integer) As Texture
        If t.isGebäude Then
            Return BackGebäude(Style, 0)
        Else
            Select Case t.getID
                Case "EBENE"
                    Return BackEbene(Style)
                Case "EBENE+SCHROTT"
                    Return BackEbene(Style)
                Case "WALD"
                    Return BackWald(Style, 0)
                Case "BERG"
                    Return BackBerg(Style, 0)
                Case "STRAßE"
                    Return BackStraße(Style)
                Case Else
                    Return BackEbene(Style)
            End Select
        End If
    End Function
    ''' <summary>
    ''' Gibt den Hintergrund normal zurück
    ''' </summary>
    ''' <param name="style"></param>
    ''' <param name="t"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function getAltBack(ByVal style As Integer, ByVal t As ObjektLandschaft) As Texture

        Select Case t.getID
            'Hier haben wir die Gebäude
            Case "STADT"
                Return BackGebäude(style, 1)
            Case "BASIS"
                Return BackGebäude(style, 2)
            Case "FLUGHAFEN"
                Return BackGebäude(style, 3)
            Case "WERFT"
                Return BackGebäude(style, 4)
            Case "HQ"
                Return BackHQ(style, t.Gebäude.GetSpieler.GetArmyNumber)
                'Hier die Landschaften
            Case "EBENE"
                Return BackEbene(style)
            Case "EBENE+SCHROTT"
                Return BackEbene(style)
            Case "WALD"
                Return BackWald(style, 1)
            Case "BERG"
                Return BackBerg(MaxStyles, 1)
            Case "STRAßE"
                Return BackStraße(MaxStyles)
            Case "BRÜCKE"
                Return BackBrücke(MaxStyles)
            Case "FLUSS"
                Return BackFluss(MaxStyles)
            Case "SEE"
                Return BackSee(MaxStyles)
            Case "RIFF"
                Return BackSee(MaxStyles)
            Case "STRAND"
                Return BackStrand(MaxStyles)
            Case "PFAD"
                Return BackStraße(MaxStyles)
            Case "WÜSTE"
                Return BackEbene(style)
            Case "WÜSTE+SCHROTT"
                Return BackEbene(style)
            Case "AUSGETROCKNETESFLUSSBETT"
                Return BackFluss(MaxStyles)
            Case "FELSEN"
                Return BackBerg(MaxStyles, 1)
            Case "KAKTEEN"
                Return BackWald(style, 1)
            Case "PIPELINE"
                Return BackEbene(style)
            Case "PIPE"
                Return BackEbene(style)
            Case "PIPESCHWEIß"
                Return BackEbene(style)
            Case "SCHWEIßNAHT"
                Return BackEbene(style)
            Case "KAPUTTESCHWEIßNAHT"
                Return BackEbene(style)
            Case "ZUGBRÜCKE"
                Return BackBrücke(MaxStyles)
            Case "MAUER"
                Return BackEbene(style)
            Case "KAPUTTEPIPESCHWEIß"
                Return BackEbene(style)
            Case "PLINE"
                Return BackEbene(style)
            Case "PLINESCHWEIß"
                Return BackEbene(style)
            Case "PLINEKAPUTT"
                Return BackEbene(style)
            Case "GIPFEL"
                Return BackBerg(MaxStyles, 1)
            Case "KIEFERN"
                Return BackWald(style, 1)
            Case "SCHNEE"
                Return BackEbene(style)
            Case "STRAßENFROST"
                Return BackStraße(style)
            Case "SCHNEE+SCHROTT"
                Return BackEbene(style)
            Case "SUMPF"
                Return BackEbene(style)
            Case Else
                If t.isGebäude Then
                    Return BackGebäude(style, 1)
                Else
                    Return BackWald(style, 0)
                End If
        End Select
    End Function
    ''' <summary>
    ''' Gibt den Vordergrund zurück.
    ''' </summary>
    ''' <param name="style"></param>
    ''' <param name="t"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function getFore(ByVal style As Integer, ByVal t As ObjektLandschaft, Optional ByVal NoRandom As Boolean = False)
        If t.isGebäude Then
            Select Case t.getID
                Case "STADT"
                    Return Gebäude(style, 0)
                Case "BASIS"
                    Return Gebäude(style, 2)
                Case "FLUGHAFEN"
                    Return Gebäude(style, 3)
                Case "WERFT"
                    Return Gebäude(style, 4)
                Case "HQ"
                    Return HQ(style, t.Gebäude.GetSpieler.GetArmyNumber)
                Case Else
                    Return Gebäude(style, 0)
            End Select
        Else
            Select Case t.getID
                Case "EBENE"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If

                Case "EBENE+SCHROTT"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If
                Case "WALD"
                    Return Wald(style, 1)
                Case "BERG"
                    Return Berg(MaxStyles)
                Case "STRAßE"
                    Return Straße(MaxStyles)
                Case "BRÜCKE"
                    Return Brücke(MaxStyles)
                Case "FLUSS"
                    Return Fluss(MaxStyles)
                Case "SEE"
                    Return See(MaxStyles)
                Case "RIFF"
                    Return See(MaxStyles)
                Case "STRAND"
                    Return Strand(MaxStyles)
                Case "PFAD"
                    Return Straße(MaxStyles)
                Case "WÜSTE"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If
                Case "WÜSTE+SCHROTT"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If
                Case "AUSGETROCKNETESFLUSSBETT"
                    Return Fluss(MaxStyles)
                Case "FELSEN"
                    Return Berg(MaxStyles)
                Case "KAKTEEN"
                    Return Wald(style, 1)
                Case "PIPELINE"
                    Return Pipeline(style)
                Case "PIPE"
                    Return Pipeline(style)
                Case "PIPESCHWEIß"
                    Return Pipeline(style)
                Case "SCHWEIßNAHT"
                    Return Pipeline(style)
                Case "KAPUTTESCHWEIßNAHT"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If
                Case "ZUGBRÜCKE"
                    Return Brücke(MaxStyles)
                Case "MAUER"
                    Return Pipeline(style)
                Case "KAPUTTEPIPESCHWEIß"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If
                Case "PLINE"
                    Return Pipeline(style)
                Case "PLINESCHWEIß"
                    Return Pipeline(style)
                Case "PLINEKAPUTT"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If
                Case "GIPFEL"
                    Return Berg(MaxStyles)
                Case "KIEFERN"
                    Return Wald(style, 1)
                Case "SCHNEE"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If
                Case "STRAßENFROST"
                    Return Straße(style)
                Case "SCHNEE+SCHROTT"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If
                Case "SUMPF"
                    If NoRandom Then
                        Return Ebene(style, 0)
                    Else
                        Return Ebene(style, Zufallszahl(0, 2))
                    End If
                Case Else
                    Return Ebene(style, 0)
            End Select
        End If
    End Function
    Public Shared Function GetForeSee(ByVal Style As Integer) As Texture
        Return See(Style)
    End Function
    Public Shared Function GetAltBackSee(ByVal Style As Integer) As Texture
        Return BackSee(Style)
    End Function
    Public Shared Function GetScreenFlash(ByVal Screen As Integer) As Texture
        Return ScreenFlash(Screen)
    End Function
    Public Shared Function GetSonstigeTexturen(ByVal I As Integer) As Texture
        Return SonstigeTexturen(I)
    End Function
    Public Shared Function GetWaffenAnimation(ByVal Animation As Kampfanimation, ByVal Flip As Boolean)
        Return WaffenTexturen(Animation)
    End Function
End Class
Public Class KampfAnimation
    Public Const KampfStart As Integer = 15
    Public Const Bildbreite As Integer = 127
    Public Const BildHöhe As Integer = 192
    Public Shared SchadensFrameVerteidiger As Integer = 145
    Public Shared SchadensFrameAngreifer As Integer = 180
    Public Const Schadensdauer As Integer = 20
    Public Shared intColor As Color = Color.FromArgb(255, 255, 255, 255)
    Dim attacker As ObjektEinheit
    Dim defender As ObjektEinheit
    Dim backa, backb As Texture
    Dim forea, foreb As Texture
    Dim Flashscreen As Integer = 0
    Dim atkTerrain, defTerrain As ObjektLandschaft
    Dim atkDmg, countDmg As Integer
    Dim Dauer As Integer = 220
    Dim AttackerAnimation As EinheitenAnimation
    Dim DeffenderAnimation As EinheitenAnimation
    Private Frames As Integer
    Public Property Frame() As Integer
        Get
            Return Frames
        End Get
        Set(ByVal value As Integer)
            Frames += 1
        End Set
    End Property
    Dim MalX As Integer = 0
    Dim MalY As Integer = 0
    Dim Fernkampf As Boolean = False

    ''' <summary>
    ''' Das X zum Malen der bewegten Luft bzw. See.
    ''' </summary>
    ''' <remarks></remarks>
    Dim BewegungsX As Integer

    Public Sub New(ByVal ATK As ObjektEinheit, ByVal Def As ObjektEinheit, ByVal counterDamage As Integer, ByVal damage As Integer, ByVal Fernkampf As Boolean)
        ObjektMaus.Visible = False
        atkDmg = damage
        If atkDmg > Def.Leben Then atkDmg = Def.Leben
        countDmg = counterDamage
        If countDmg > ATK.Leben Then countDmg = ATK.Leben
        Me.Fernkampf = Fernkampf
        attacker = ATK
        defender = Def
        Dim OpferPosition As EinheitenAnimation.OpferPositionen = EinheitenAnimation.OpferPositionen.GleicheHöhe
        Dim AngreiferPosition As EinheitenAnimation.OpferPositionen = EinheitenAnimation.OpferPositionen.GleicheHöhe
        Dim ATKFliegt As Boolean = ATK.IsFlyingUnit
        Dim DEFFliegt As Boolean = Def.IsFlyingUnit
        If ATKFliegt = DEFFliegt Then
            If ATKFliegt = False Then
                'Jetzt müssten wir schauen ob eine Einheit auf einem Berg steht und das wäre es. 
                'Verschoben
            Else
                OpferPosition = EinheitenAnimation.OpferPositionen.GleicheHöhe
                AngreiferPosition = EinheitenAnimation.OpferPositionen.GleicheHöhe
            End If
        ElseIf ATKFliegt = True And DEFFliegt = False Then
            OpferPosition = EinheitenAnimation.OpferPositionen.Unten
            AngreiferPosition = EinheitenAnimation.OpferPositionen.Oben
        ElseIf ATKFliegt = False And DEFFliegt = True Then
            OpferPosition = EinheitenAnimation.OpferPositionen.Oben
            AngreiferPosition = EinheitenAnimation.OpferPositionen.Unten
        End If

        AttackerAnimation = EinheitenAnimation.CreateUnitAnimation(ATK, counterDamage, False, ATK.GetUsingWeapon(defender, Fernkampf), Fernkampf, OpferPosition)

        If Fernkampf Or counterDamage <= 0 Then
            DeffenderAnimation = EinheitenAnimation.CreateUnitAnimation(Def, atkDmg, True, Def.GetUsingWeapon(ATK, Fernkampf), True, AngreiferPosition)
        Else
            DeffenderAnimation = EinheitenAnimation.CreateUnitAnimation(Def, atkDmg, True, Def.GetUsingWeapon(ATK, Fernkampf), Fernkampf, AngreiferPosition)
        End If


        'Nach dem Schaden warten wir noch kurz
        Dauer = SchadensFrameAngreifer + 20

        If Not attacker.Bewegungsart.ToUpper = MovementSorts.Transport.ToString.ToUpper And Not attacker.Bewegungsart.ToUpper = MovementSorts.Schiff.ToString.ToUpper Then
            forea = KampfGrafiken.getFore(0, attacker.GetTerrain)
        Else
            forea = KampfGrafiken.GetForeSee(0)
        End If
        If Not defender.Bewegungsart.ToUpper = MovementSorts.Transport.ToString.ToUpper And Not defender.Bewegungsart.ToUpper = MovementSorts.Schiff.ToString.ToUpper Then
            foreb = KampfGrafiken.getFore(0, defender.GetTerrain)
        Else
            foreb = KampfGrafiken.GetForeSee(0)
        End If
        atkTerrain = attacker.GetTerrain
        defTerrain = defender.GetTerrain
        'Damit die Animation in der Bildschirme Mitte gezeigt wird.
        MalX = Hauptmenü.MainMenü.MalPanel.Width / 2 - Bildbreite - 2
        MalY = Hauptmenü.MainMenü.MalPanel.Height / 2 - BildHöhe / 2
        'eventuell später um links rechts von Angreifer Verteidiger zu setzen
        Dim orientation As Integer = KampfGrafiken.orient(attacker.GetLocation(), defender.GetLocation())

        If Not attacker.Bewegungsart.ToUpper = MovementSorts.Transport.ToString.ToUpper And Not attacker.Bewegungsart.ToUpper = MovementSorts.Schiff.ToString.ToUpper Then
            Select Case atkTerrain.getID
                Case "EBENE"
                    backa = KampfGrafiken.getPlainBack(attacker, defender, 0)
                Case "STRAßE"
                    backa = KampfGrafiken.getPlainBack(attacker, defender, 0)
                Case "EBENE+SCHROTT"
                    backa = KampfGrafiken.getPlainBack(attacker, defender, 0)
                Case Else
                    backa = KampfGrafiken.getAltBack(0, atkTerrain)
            End Select
        Else
            backa = KampfGrafiken.GetAltBackSee(0)
        End If
        If Not defender.Bewegungsart.ToUpper = MovementSorts.Transport.ToString.ToUpper And Not defender.Bewegungsart.ToUpper = MovementSorts.Schiff.ToString.ToUpper Then
            Select Case defTerrain.getID
                Case "EBENE"
                    backb = KampfGrafiken.getPlainBack(defender, attacker, 0)
                Case "STRAßE"
                    backb = KampfGrafiken.getPlainBack(defender, attacker, 0)
                Case "EBENE+SCHROTT"
                    backb = KampfGrafiken.getPlainBack(defender, attacker, 0)
                Case Else
                    backb = KampfGrafiken.getAltBack(0, defTerrain)
            End Select
        Else
            backb = KampfGrafiken.GetAltBackSee(0)
        End If

        'Event Handling hinzufügen
        AddHandler Hauptmenü.MainMenü.MalPanel.MouseDown, AddressOf MouseDown
        AddHandler Hauptmenü.MainMenü.KeyDown, AddressOf KeyDown
    End Sub
    Public Function Malen() As Boolean
        Dim sngRotation As Single = 0
        Grafikengine.ptfRotCenter = New Point(0, 0)
        If Frame < KampfStart Then
            intColor = Color.FromArgb(Frames * 5, 255, 255, 255)
            Grafikengine.recBild = Nothing
            Grafikengine.ptfPosition = New Drawing.Point(0, 0)
            With Grafikengine.szfScale
                .Height = Hauptmenü.MainMenü.MalPanel.Height
                .Width = Hauptmenü.MainMenü.MalPanel.Width
            End With
            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetScreenFlash(Flashscreen), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)

        Else
            intColor = Color.FromArgb(102, 255, 255, 255)
            Grafikengine.recBild = Nothing
            Grafikengine.ptfPosition = New Drawing.Point(0, 0)
            With Grafikengine.szfScale
                .Height = Hauptmenü.MainMenü.MalPanel.Height
                .Width = Hauptmenü.MainMenü.MalPanel.Width
            End With
            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetScreenFlash(Flashscreen), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        End If


        intColor = Color.FromArgb(255, 255, 255, 255)


        If Frame < Dauer And Frame > KampfStart Then


            With Grafikengine.szfScale
                .Width = 320
                .Height = 250
            End With
            Grafikengine.ptfPosition = New Drawing.Point(MalX - 31, MalY - 34)
            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetSonstigeTexturen(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Grafikengine.ptfPosition = New Drawing.Point(MalX, MalY)
            Grafikengine.szfScale = Nothing
            'Zuerst Malen wir die Angreifer Seite
            If Not attacker.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper And Not attacker.Bewegungsart.ToUpper = MovementSorts.Schiff.ToString.ToUpper And Not attacker.Bewegungsart.ToUpper = MovementSorts.Transport.ToString.ToUpper Then
                Grafikengine.Sprite.Draw2D(KampfGrafiken.getSky(0, atkTerrain), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.Sprite.Draw2D(backa, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.Sprite.Draw2D(forea, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Else
                'Jetzt malen wir die Sache bewegt.
                BewegungsX += 3
                If BewegungsX > 127 Then BewegungsX -= 127
                With Grafikengine.recBild
                    .X = BewegungsX : .Width = 127 - BewegungsX
                    .Y = 0 : .Height = 192
                End With
                If attacker.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper Then
                    Grafikengine.Sprite.Draw2D(KampfGrafiken.GetAirSky(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Else
                    Grafikengine.Sprite.Draw2D(KampfGrafiken.getSky(0, atkTerrain), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                End If
                If Not attacker.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper Then
                    Grafikengine.Sprite.Draw2D(backa, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    Grafikengine.Sprite.Draw2D(forea, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                End If
                Grafikengine.ptfPosition.X += (127 - BewegungsX)
                With Grafikengine.recBild
                    .X = 0 : .Width = BewegungsX
                    .Y = 0 : .Height = 192
                End With
                If attacker.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper Then
                    Grafikengine.Sprite.Draw2D(KampfGrafiken.GetAirSky(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Else
                    Grafikengine.Sprite.Draw2D(KampfGrafiken.getSky(0, atkTerrain), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                End If
                If Not attacker.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper Then
                    Grafikengine.Sprite.Draw2D(backa, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    Grafikengine.Sprite.Draw2D(forea, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                End If
                'Zurücksetzen fürs weitere malen.
                Grafikengine.recBild = Nothing
                Grafikengine.ptfRotCenter = New Point()
            End If
            Grafikengine.ptfPosition = New Drawing.Point(MalX + 127 * 2 + 4, MalY)
            'Jetzt die Verteidiger Seite
            With Grafikengine.szfScale
                .Height = BildHöhe
                .Width = -Bildbreite
            End With

            If Not defender.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper And Not defender.Bewegungsart.ToUpper = MovementSorts.Schiff.ToString.ToUpper And Not defender.Bewegungsart.ToUpper = MovementSorts.Transport.ToString.ToUpper Then
                Grafikengine.Sprite.Draw2D(KampfGrafiken.getSky(0, defTerrain), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.Sprite.Draw2D(backb, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.Sprite.Draw2D(foreb, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Else
                'Jetzt malen wir die Sache bewegt.
                With Grafikengine.recBild
                    .X = BewegungsX : .Width = 127 - BewegungsX
                    .Y = 0 : .Height = 192
                End With
                Grafikengine.szfScale.Width = -Grafikengine.recBild.Width
                If defender.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper Then
                    Grafikengine.Sprite.Draw2D(KampfGrafiken.GetAirSky(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Else
                    Grafikengine.Sprite.Draw2D(KampfGrafiken.getSky(0, defTerrain), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                End If
                If Not defender.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper Then
                    Grafikengine.Sprite.Draw2D(backb, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    Grafikengine.Sprite.Draw2D(foreb, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                End If

                Grafikengine.ptfPosition.X -= (127 - BewegungsX)
                With Grafikengine.recBild
                    .X = 0 : .Width = BewegungsX
                    .Y = 0 : .Height = 192
                End With
                Grafikengine.szfScale.Width = -Grafikengine.recBild.Width
                If defender.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper Then
                    Grafikengine.Sprite.Draw2D(KampfGrafiken.GetAirSky(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Else
                    Grafikengine.Sprite.Draw2D(KampfGrafiken.getSky(0, defTerrain), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                End If
                If Not defender.Bewegungsart.ToUpper = MovementSorts.Flugzeug.ToString.ToUpper Then
                    Grafikengine.Sprite.Draw2D(backb, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    Grafikengine.Sprite.Draw2D(foreb, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                End If
                'Zurücksetzen fürs weitere malen.
                Grafikengine.recBild = Nothing
                Grafikengine.ptfRotCenter = New Point()
            End If


            Grafikengine.szfScale = Nothing
            Dim ATKLeben As Single = attacker.Leben
            Dim DEFLeben As Single = defender.Leben
            If Frame > SchadensFrameAngreifer Then
                If Frame <= SchadensFrameAngreifer + Schadensdauer Then
                    Dim ProzLeben As Single = (((attacker.Leben) * (20 - (Frame - SchadensFrameAngreifer)) + (attacker.Leben - countDmg) * (Frame - SchadensFrameAngreifer)) / 20) / (100)
                    ATKLeben *= ProzLeben
                    Grafikengine.fillRect(MalX, MalY - 9, (127 * ProzLeben), 9, CalculateLiveBarColor(ATKLeben)) 'draws the appropriate percent of the life bar
                    'Jetzt malen wir noch die Lebenszahl

                Else
                    Dim ProzLeben As Single = (attacker.Leben - countDmg) / (100)
                    ATKLeben *= ProzLeben
                    Grafikengine.fillRect(MalX, MalY - 9, (127 * ProzLeben), 9, CalculateLiveBarColor(ATKLeben))
                End If
            Else
                Dim ProzLeben As Single = (attacker.Leben) / (100)
                ATKLeben *= ProzLeben
                Grafikengine.fillRect(MalX, MalY - 9, (127 * ProzLeben), 9, CalculateLiveBarColor(ATKLeben)) 'draws the appropriate percent of the life bar
            End If

            If Frame > SchadensFrameVerteidiger Then
                If Frame <= SchadensFrameVerteidiger + Schadensdauer Then
                    Dim ProzLeben As Single = (((defender.Leben) * (20 - (Frame - SchadensFrameVerteidiger)) + (defender.Leben - atkDmg) * (Frame - SchadensFrameVerteidiger)) / 20) / (100)
                    DEFLeben *= ProzLeben
                    Grafikengine.fillRect(MalX + 127 + 4, MalY - 9, (127 * ProzLeben), 9, CalculateLiveBarColor(DEFLeben)) 'draws the appropriate percent of the life bar
                Else
                    Dim ProzLeben As Single = (defender.Leben - atkDmg) / (100)
                    DEFLeben *= ProzLeben
                    Grafikengine.fillRect(MalX + 127 + 4, MalY - 9, (127 * ProzLeben), 9, CalculateLiveBarColor(DEFLeben)) 'draws the appropriate percent of the life bar
                End If
            Else
                Dim ProzLeben As Single = (defender.Leben) / (100)
                DEFLeben *= ProzLeben
                Grafikengine.fillRect(MalX + 127 + 4, MalY - 9, (127 * ProzLeben), 9, CalculateLiveBarColor(DEFLeben)) 'draws the appropriate percent of the life bar
            End If
            Grafikengine.szfScale = Nothing
            Grafikengine.recBild = Nothing
            If Not attacker.Bewegungsart = MovementSorts.Flugzeug.ToString.ToUpper And Not attacker.Bewegungsart = MovementSorts.Helikopter.ToString.ToUpper Then
                Dim Max As Integer = attacker.GetSpieler.GetDeffensivSterne(defender, atkTerrain)
                Dim StartX As Integer = 127 - Max * 8 - 5
                Grafikengine.ptfPosition = New Drawing.Point(MalX + StartX, MalY + 12)
                For I = 0 To Max - 1
                    Grafikengine.Sprite.Draw2D(ObjektKOInformation.BildTexturen(5), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    Grafikengine.ptfPosition.X += 8
                    If I = 4 Then
                        Grafikengine.ptfPosition = New Drawing.Point(MalX + StartX + 1 + Bildbreite, MalY + 12 + 10)
                    End If
                Next
            End If
            If Not defender.Bewegungsart = MovementSorts.Flugzeug.ToString.ToUpper And Not defender.Bewegungsart = MovementSorts.Helikopter.ToString.ToUpper Then
                Grafikengine.ptfPosition = New Drawing.Point(MalX + 5 + Bildbreite, MalY + 12)
                For I = 0 To defender.GetSpieler.GetDeffensivSterne(attacker, defTerrain) - 1
                    Grafikengine.Sprite.Draw2D(ObjektKOInformation.BildTexturen(5), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    Grafikengine.ptfPosition.X += 8
                    If I = 4 Then
                        Grafikengine.ptfPosition = New Drawing.Point(MalX + 4 + Bildbreite, MalY + 12 + 10)
                    End If
                Next
            End If
            Grafikengine.szfScale = Nothing
            AttackerAnimation.Malen(Frame, New Point(MalX, MalY))
            DeffenderAnimation.Malen(Frame, New Point(MalX, MalY))
            'Zuletzt malen wir diesen Vordergrundteil
            With Grafikengine.szfScale
                .Width = 320
                .Height = 250
            End With
            'Wir malen den Button auf den das KO Bild kommt
            Grafikengine.recBild = Nothing
            Grafikengine.ptfPosition = New Drawing.Point(MalX - 31, MalY - 34)
            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetSonstigeTexturen(1), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Grafikengine.ptfPosition = New Drawing.Point(MalX, MalY)

            Grafikengine.szfScale = Nothing
            Grafikengine.recBild = Nothing
            Grafikengine.ptfPosition = New Drawing.Point(MalX + 24 - 40, MalY + 24 - 40 + 5)
            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetSonstigeTexturen(2), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Grafikengine.ptfPosition = New Drawing.Point(MalX + 24 - 40 + 127 * 2 + 4 - 48, MalY + 24 - 40 + 5)
            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetSonstigeTexturen(2), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)

            Dim emotiona As Integer = CalculateEmotion(ATKLeben, DEFLeben)
            Dim emotionb As Integer = CalculateEmotion(DEFLeben, ATKLeben)


            'Angreifer KO Malen
            Objektverwalter.Spielfeld.Spieler(attacker.Spieler).KOS(0).KOGesichtsausdruckMalen(emotiona, MalX, MalY + 5)
            'Verteidiger KO Malne
            Objektverwalter.Spielfeld.Spieler(defender.Spieler).KOS(0).KOGesichtsausdruckMalen(emotiona, MalX + 127 * 2 + 4 - 48, MalY + 5)

            Grafikengine.szfScale = Nothing
            Grafikengine.recBild = Nothing
            Grafikengine.ptfPosition = New Drawing.Point(MalX + 24 - 40, MalY + 24 - 40 + 5)
            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetSonstigeTexturen(3), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Grafikengine.ptfPosition = New Drawing.Point(MalX + 24 - 40 + 127 * 2 + 4 - 48, MalY + 24 - 40 + 5)
            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetSonstigeTexturen(3), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)


        End If
        If Frame > Dauer Then
            RemoveHandles()
            Return True
        End If
        Frame = 1
        Return False
    End Function
    Public Shared Function CalculateLiveBarColor(ByVal Leben As Single) As Color
        Select Case Leben
            Case Is > 80
                Return Color.Green
            Case Is > 60
                Return Color.FromArgb(255, 0, 192, 0)
            Case Is > 40
                Return Color.Yellow
            Case Is > 20
                Return Color.Orange
            Case Else
                Return Color.Red
        End Select
    End Function
    ''' <summary>
    ''' 0=Keine
    ''' 1=Lachend
    ''' 2=Traurig
    ''' </summary>
    ''' <param name="EigenLeben"></param>
    ''' <param name="GegnerLeben"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function CalculateEmotion(ByVal EigenLeben As Single, ByVal GegnerLeben As Single) As Integer
        Dim Emotion As Integer = 0
        If Fernkampf = True Then
            If EigenLeben = attacker.Leben Then
                Return 1
            Else
                Return 2
            End If
        End If
        If EigenLeben = 0 Then Return 2
        If EigenLeben - GegnerLeben > 30 Then Return 1
        If EigenLeben - GegnerLeben < -30 Then Return 2
        Return 0
    End Function

    Private Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Select Case e.Button
            Case MouseButtons.Right
                Frames = Dauer + 1
        End Select
    End Sub
    Private Sub KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        Select Case e.KeyCode
            Case My.Settings.Abrechen
                Frames = Dauer + 1
        End Select
    End Sub
    Public Sub RemoveHandles()
        RemoveHandler Hauptmenü.MainMenü.MalPanel.MouseDown, AddressOf MouseDown
        RemoveHandler Hauptmenü.MainMenü.KeyDown, AddressOf KeyDown
    End Sub
End Class


Public MustInherit Class EinheitenAnimation
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="Unit"></param>
    ''' <param name="Flip"></param>
    ''' <remarks></remarks>
    Public Sub New(ByVal Unit As ObjektEinheit, ByVal Flip As Boolean, ByVal Damage As Single, ByVal Waffe As Integer, ByVal YStart As Integer, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
        Dim Animation As Objektverwalter.Kampfanimation = Objektverwalter.AlleEinheiten(Unit.BildID).GetKampfAnimation(Unit.GetSpieler.Armee)
        'For I = 0 To Unit.GetSpieler.Kampfanimationen.Length - 1
        '    If Unit.EinheitenID = Unit.GetSpieler.Kampfanimationen(I).EinheitenID Then
        '        Animation = Unit.GetSpieler.Kampfanimationen(I)
        '        Exit For
        '    End If
        'Next

        NumberOfUnits = Animation.Truppenzahl
        Einheit = Unit
        Me.Spielerfarbe = Unit.GetSpieler.Farbe
        If Einheit.Bewegungsart = MovementSorts.Flugzeug.ToString Or Einheit.Bewegungsart = MovementSorts.Helikopter.ToString Then
            'Die Einheit fliegt
            FlyingUnit = True
        Else
            FlyingUnit = False
        End If
        Me.Flip = Flip
        Schaden = Damage
        Me.MoveAnimationFrames = Animation.MovementFrames
        Me.StoppingFrames = Animation.Stoppingframes
        MoveAnimation = Animation.Bewegungstextur
        MoveAnimationMaske = Animation.BewegungstexturMaske
        If Waffe = 1 Then
            Me.FireAnimationFrames = Animation.Firingframes1
            FireAnimation = Animation.KampfanimationWaffe1
            FireAnimationMaske = Animation.KampfanimationWaffe1Maske
        ElseIf Waffe = 2 Then
            Me.FireAnimationFrames = Animation.Firingframes2
            FireAnimation = Animation.KampfanimationWaffe2
            FireAnimationMaske = Animation.KampfanimationWaffe2Maske
        Else
            Me.FireAnimationFrames = Animation.Firingframes1
            FireAnimation = Animation.KampfanimationWaffe1
            FireAnimationMaske = Animation.KampfanimationWaffe1Maske
        End If
        Me.EinzelUnitPosition = Animation.EinzelUnitPosition
        Me.YStart = YStart
        Me.UsingWeapon = Waffe
        Me.OpferPosition = OpferPosition
        Me.Fernkampf = Fernkampf
        'wir berechnen den Framestart
        If Flip = False Then
            '40 weil 20 ist Schatten erstellen und wir warten noch mal 20 Frames
            If Fernkampf = True Or MoveAnimationFrames <= 0 Then
                'Wir warten etwas länger
                FrameStart = 35
            Else
                FrameStart = 20
            End If
            KampfAnimation.SchadensFrameVerteidiger = FrameStart + (FireAnimationFrames + StoppingFrames + MoveAnimationFrames) * FrameHalter - 6
        Else
            If Fernkampf = True Or Waffe <= 0 Then
                KampfAnimation.SchadensFrameAngreifer = KampfAnimation.SchadensFrameVerteidiger
            Else
                '40 Frames zeit verzögerung zum Angreifer.
                KampfAnimation.SchadensFrameAngreifer = KampfAnimation.SchadensFrameVerteidiger + 40
                FrameStart = KampfAnimation.SchadensFrameAngreifer - FireAnimationFrames * FrameHalter - 6
            End If
        End If
        'wir laden die Bilder
        Me.EinheitenBreite = Animation.Bildgröße.Width
        Me.EinheitenHöhe = Animation.Bildgröße.Height
    End Sub
    Public Shared Function CreateUnitAnimation(ByVal Unit As ObjektEinheit, ByVal Schaden As Single, ByVal Flip As Boolean, ByVal Waffe As Integer, ByVal DoCounterAttack As Boolean, ByVal OpferPosition As OpferPositionen)
        Select Case Unit.EinheitenID
            Case "KPZ"
                Return New EinheitenAnimationKampfPanzer(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "RKW"
                Return New EinheitenAnimationRaketenwerfer(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "TTP"
                Return New EinheitenAnimationTTP(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "INF"
                Return New EinheitenAnimationInfanterie(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case MovementSorts.Mech.ToString.ToUpper
                Return New EinheitenAnimationMech(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "JGPZ"
                Return New EinheitenAnimationJagdpanzer(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "SPÄHER"
                Return New EinheitenAnimationSpäher(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "ART"
                Return New EinheitenAnimationArtillerie(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case "FLAK"
                Return New EinheitenAnimationFlak(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
            Case Else
                Return New EinheitenAnimationDefault(Unit, Schaden, Waffe, Flip, DoCounterAttack, OpferPosition)
        End Select
    End Function
    Public MustOverride Sub Malen(ByVal Frames As Integer, ByVal MalStart As Point)
#Region "Variablen"
    Enum OpferPositionen
        Unten
        GleicheHöhe
        Oben
    End Enum
    Const Bildbreite As Integer = 127
    Const BildHöhe As Integer = 192
    Const FrameHalter As Integer = 3 'So wie schnell der Kampf abgespielt wird!
    Protected YStart As Integer = 130
    Const XStart As Integer = -44
    Dim MovingSteps As Integer = 7
    ''' <summary>
    ''' Die Zahl der maximalen Truppenstärke.
    ''' </summary>
    ''' <remarks></remarks>
    Dim NumberOfUnits As Integer = 5
    Protected MoveAnimation As Texture
    Protected MoveAnimationMaske As Texture
    Protected MoveAnimationFrames As Integer = 0
    Protected StoppingFrames As Integer = 0
    Protected FireAnimation As Texture
    Protected FireAnimationMaske As Texture
    Protected FireAnimationFrames As Integer = 0
    Protected Flip As Boolean = False
    Protected Einheit As ObjektEinheit
    Protected Schaden As Single
    Protected FrameStart As Integer = 120
    Protected EinzelUnitPosition As Point
    Protected FlyingUnit As Boolean
    Protected Fernkampf As Boolean
    Protected UsingWeapon As Integer
    Protected OpferPosition As OpferPositionen
    Dim EinheitenBreite As Integer = 100
    Dim EinheitenHöhe As Integer = 70
    Dim Spielerfarbe As Color
#End Region
#Region "Malen"
#Region "Units"
    ''' <summary>
    ''' Malt die Einheit\en beim reinlaufen 
    ''' </summary>
    ''' <param name="Frames"></param>
    ''' <remarks></remarks>
    Public Sub DrawMovingAnimation(ByVal Frames As Integer, ByVal MalStart As Point)
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.szfScale = Nothing
        If NumberOfUnits = 5 Then
            'ÜberlebendeEinheiten ist die Zahld der gemalten Truppen.
            Dim ÜberlebendeEinheiten As Integer = GetÜberlebendeEinheiten(Frames)
            While ÜberlebendeEinheiten > 0
                Frames -= ÜberlebendeEinheiten
                If Flip = False Then
                    If Fernkampf = False Then
                        If Frames > KampfAnimation.KampfStart And Frames <= FrameStart Then
                            'Die Einheit am Anfang
                            Dim Position As Point = New Point(XStart - MovingSteps * MoveAnimationFrames * FrameHalter + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                            If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        ElseIf Frames > FrameStart And Frames <= FrameStart + MoveAnimationFrames * FrameHalter Then  'move in
                            Dim Frame As Integer = Math.DivRem(Frames - FrameStart, FrameHalter, 0)
                            'Die Einheit läuft rein.
                            Dim MalFrame As Integer = (MoveAnimationFrames * FrameHalter) - (Frames - FrameStart)
                            Dim Position As Point = New Point(XStart - MalFrame * MovingSteps + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                            If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            Dim Ausschnitt As Point = SetBildAusschnitt(Frame, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        ElseIf Frames > FrameStart + MoveAnimationFrames * FrameHalter And Frames <= FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter Then  'stop
                            'Die Einheit stopt
                            Dim Frame As Integer = Math.DivRem(Frames - FrameStart, FrameHalter, 0)
                            Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                            If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            Dim Ausschnitt As Point = SetBildAusschnitt(Frame, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        End If
                    Else
                        If MoveAnimationFrames <= 0 Then
                            If Frames <= FrameStart Then
                                'Die Einheit am Anfang Fernkämpfer
                                Dim Position As Point = New Point(XStart - MovingSteps * MoveAnimationFrames * FrameHalter + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                                If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                                If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                                Dim Ausschnitt As Point = SetBildAusschnitt(0, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                                Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                            End If
                        Else
                            If Frames > KampfAnimation.KampfStart And Frames <= FrameStart Then
                                'Die Einheit am Anfang
                                Dim Position As Point = New Point(XStart - MovingSteps * MoveAnimationFrames * FrameHalter + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                                If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                                If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                                Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                                Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                            ElseIf Frames > FrameStart And Frames <= FrameStart + MoveAnimationFrames * FrameHalter Then  'move in
                                Dim Frame As Integer = Math.DivRem(Frames - FrameStart, FrameHalter, 0)
                                'Die Einheit läuft rein.
                                Dim MalFrame As Integer = (MoveAnimationFrames * FrameHalter) - (Frames - FrameStart)
                                Dim Position As Point = New Point(XStart - MalFrame * MovingSteps + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                                If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                                If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                                Dim Ausschnitt As Point = SetBildAusschnitt(Frame, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                                Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                            ElseIf Frames > FrameStart + MoveAnimationFrames * FrameHalter And Frames <= FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter Then  'stop
                                'Die Einheit stopt
                                Dim Frame As Integer = Math.DivRem(Frames - FrameStart, FrameHalter, 0)
                                Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                                If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                                If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                                Dim Ausschnitt As Point = SetBildAusschnitt(Frame, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                                Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                            End If
                        End If
                    End If
                ElseIf Frames > KampfAnimation.KampfStart Then
                    Dim Frame As Integer = Math.DivRem(Frames - FrameStart, FrameHalter, 0)
                    Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                    If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                    If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                    Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                    Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                    If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                    DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                End If
                Frames += ÜberlebendeEinheiten
                ÜberlebendeEinheiten -= 1
            End While
        Else
            'Jetzt müssten wir nur eine Einheit malen. Z.Bsp einen TTP
            'Diese Laufen außerdem nicht rein.
            If Frames > KampfAnimation.KampfStart And Frames <= FrameStart Then
                'Die Einheit am Anfang
                Dim Position As Point = EinzelUnitPosition
                If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
            End If
        End If
    End Sub 'Fertig
    Public Sub DrawFiringAnimation(ByVal Frames As Integer, ByVal MalStart As Point)
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.szfScale = Nothing
        If NumberOfUnits = 5 Then
            Dim ÜberlebendeEinheiten As Integer = GetÜberlebendeEinheiten(Frames)
            While ÜberlebendeEinheiten > 0
                Frames -= ÜberlebendeEinheiten
                If Flip = False Then
                    If Frames > FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter And Frames <= FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                        Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        'Beim Feuern lassen wir das Mal Besser weg. sieht sonst beschissen aus. LOL
                        'If FlyingUnit Then Grafikengine.ptfPosition.X += Zufallszahl(-1,1)
                        Dim Frame As Integer = Math.DivRem((Frames - FrameStart - (MoveAnimationFrames + StoppingFrames) * FrameHalter), FrameHalter, 0)
                        Dim Ausschnitt As Point = SetBildAusschnitt(Frame, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        'Das Bild wird gemalt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    ElseIf Frames > FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                        Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                        If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                        If Frames >= KampfAnimation.SchadensFrameAngreifer And Frames < KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 Then
                            Dim Remaining As Integer = GetÜberlebendeEinheiten(KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 + 1)
                            If ÜberlebendeEinheiten > Remaining Then
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameAngreifer + 1)
                                intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                        End If
                        If Fernkampf = True And MoveAnimationFrames <= 0 Then
                            Dim Ausschnitt As Point = SetBildAusschnitt(FireAnimationFrames, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        Else
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        End If
                    End If
                Else
                    If Fernkampf = False And UsingWeapon > 0 And Einheit.KannNurFernkampf = False Then
                        If Frames <= FrameStart Then
                            'Die Einheit am Anfang
                            Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                            If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                            If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                                Dim Remaining As Integer = GetÜberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                                If ÜberlebendeEinheiten > Remaining Then
                                    Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                    intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                                Else
                                    intcolor = Color.FromArgb(255, 255, 255, 255)
                                End If
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        ElseIf Frames > FrameStart And Frames <= FrameStart + FireAnimationFrames * FrameHalter Then
                            Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            'Beim Feuern lassen wir das Mal Besser weg. sieht sonst beschissen aus. LOL
                            'If FlyingUnit Then Grafikengine.ptfPosition.X += Zufallszahl(-1,1)
                            'Das Bild wird gemalt
                            If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                                Dim Remaining As Integer = GetÜberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                                If ÜberlebendeEinheiten > Remaining Then
                                    'Zerstörte Einheiten malen wir so
                                    Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                    intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                                    Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                                    Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                    If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                    DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                                Else
                                    'Einheiten die überleben und zurück schissen so.
                                    Dim Frame As Integer = Math.DivRem((Frames - FrameStart), FrameHalter, 0)
                                    Dim Ausschnitt As Point = SetBildAusschnitt(Frame, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                                    Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                    intcolor = Color.FromArgb(255, 255, 255, 255)
                                    If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                    DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                                End If
                            Else
                                'Ansonsten machen wir das so.
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                                Dim Frame As Integer = Math.DivRem((Frames - FrameStart), FrameHalter, 0)
                                Dim Ausschnitt As Point = SetBildAusschnitt(Frame, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                                Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                            End If
                        ElseIf Frames > FrameStart + FireAnimationFrames * FrameHalter Then
                            'Die Einheit steht wieder.
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                            Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                            If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        End If
                    Else
                        Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                        If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                        If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                            Dim Remaining As Integer = GetÜberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                            If ÜberlebendeEinheiten > Remaining Then
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                        If Fernkampf = True And MoveAnimationFrames <= 0 Or Fernkampf = False And Einheit.KannNurFernkampf = True Then
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        Else
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        End If
                    End If
                End If
                Frames += ÜberlebendeEinheiten
                ÜberlebendeEinheiten -= 1
            End While
        Else
            'Wir müssen nur eine Einheit malen kommt noch.
            If Flip = False Then
                'Wie sie feuert alles in Arbeit
                If Frames > FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter And Frames <= FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                    Dim Position As Point = EinzelUnitPosition
                    If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                    'Beim Feuern lassen wir das Mal Besser weg. sieht sonst beschissen aus. LOL
                    'If FlyingUnit Then Grafikengine.ptfPosition.X += Zufallszahl(-1,1)
                    Dim Frame As Integer = Math.DivRem((Frames - FrameStart - (MoveAnimationFrames + StoppingFrames) * FrameHalter), FrameHalter, 0)
                    Dim Ausschnitt As Point = SetBildAusschnitt(Frame, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                    Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                    'Das Bild wird gemalt
                    If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                    DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                ElseIf Frames > FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                    Dim Position As Point = EinzelUnitPosition
                    If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                    If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                    'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230

                    Dim Remaining As Integer = GetÜberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                    If Frames >= KampfAnimation.SchadensFrameAngreifer And Frames < KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 Then
                        If Remaining < 1 Then
                            Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                            intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                        Else
                            Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                            intcolor = Color.FromArgb(255, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                        End If
                    ElseIf Frames >= KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 Then
                        If Remaining < 1 Then
                            intcolor = Color.FromArgb(0, 0, 0, 0)
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                    Else
                        intcolor = Color.FromArgb(255, 255, 255, 255)
                    End If
                    If Fernkampf = True And MoveAnimationFrames <= 0 Then
                        Dim Ausschnitt As Point = SetBildAusschnitt(FireAnimationFrames, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    Else
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    End If
                End If
            Else
                If Fernkampf = False And UsingWeapon > 0 And Einheit.KannNurFernkampf = False Then
                    If Frames <= FrameStart Then
                        'Die Einheit am Anfang
                        Dim Position As Point = EinzelUnitPosition
                        If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                        Dim Remaining As Integer = GetÜberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                        If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                            If Remaining < 1 Then
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                            Else
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                intcolor = Color.FromArgb(255, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                            End If
                        ElseIf Frames >= KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                            If Remaining < 1 Then
                                intcolor = Color.FromArgb(0, 0, 0, 0)
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    ElseIf Frames > FrameStart And Frames <= FrameStart + FireAnimationFrames * FrameHalter Then
                        Dim Position As Point = EinzelUnitPosition
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        'Beim Feuern lassen wir das Mal Besser weg. sieht sonst beschissen aus. LOL
                        'If FlyingUnit Then Grafikengine.ptfPosition.X += Zufallszahl(-1,1)
                        'Das Bild wird gemalt
                        If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                            Dim Remaining As Integer = GetÜberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                            If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                                If Remaining < 1 Then
                                    Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                    intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                                Else
                                    Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                    intcolor = Color.FromArgb(255, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                                End If
                            ElseIf Frames >= KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                                If Remaining < 1 Then
                                    intcolor = Color.FromArgb(0, 0, 0, 0)
                                Else
                                    intcolor = Color.FromArgb(255, 255, 255, 255)
                                End If
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                            If 1 > Remaining Then
                                'Zerstörte Einheiten malen wir so
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                                Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                            Else
                                'Einheiten die überleben und zurück schissen so.
                                Dim Frame As Integer = Math.DivRem((Frames - FrameStart), FrameHalter, 0)
                                Dim Ausschnitt As Point = SetBildAusschnitt(Frame, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                                Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                                If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                                DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                            End If
                        Else
                            'Ansonsten machen wir das so.
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                            Dim Frame As Integer = Math.DivRem((Frames - FrameStart), FrameHalter, 0)
                            Dim Ausschnitt As Point = SetBildAusschnitt(Frame, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        End If
                    ElseIf Frames > FrameStart + FireAnimationFrames * FrameHalter Then
                        'Die Einheit steht wieder.
                        intcolor = Color.FromArgb(255, 255, 255, 255)
                        Dim Position As Point = EinzelUnitPosition
                        If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    End If
                Else
                    Dim Position As Point = EinzelUnitPosition
                    If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                    If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                    'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                    Dim Remaining As Integer = GetÜberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                    If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                        If Remaining < 1 Then
                            Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                            intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                        Else
                            Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                            intcolor = Color.FromArgb(255, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                        End If
                    ElseIf Frames >= KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                        If Remaining < 1 Then
                            intcolor = Color.FromArgb(0, 0, 0, 0)
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                    Else
                        intcolor = Color.FromArgb(255, 255, 255, 255)
                    End If
                    If Fernkampf = True And MoveAnimationFrames <= 0 Or _
                        Fernkampf = False And Einheit.KannNurFernkampf = True Or _
                        Einheit.HasNoWeapons = True Then
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    Else
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    End If
                End If
            End If
        End If
    End Sub 'Fertig
    Public Sub DrawStandingAnimation(ByVal Frames As Integer, ByVal MalStart As Point)
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.szfScale = Nothing
        If NumberOfUnits = 5 Then
            Dim ÜberlebendeEinheiten As Integer = GetÜberlebendeEinheiten(Frames)
            While ÜberlebendeEinheiten > 0
                If Flip = False Then
                    If Frames > FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter And Frames <= FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                        Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                        If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    ElseIf Frames > FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                        Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                        If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                        If Frames >= KampfAnimation.SchadensFrameAngreifer And Frames < KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 Then
                            Dim Remaining As Integer = GetÜberlebendeEinheiten(KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 + 1)
                            If ÜberlebendeEinheiten > Remaining Then
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameAngreifer + 1)
                                intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                        End If
                        If Fernkampf = True And MoveAnimationFrames <= 0 Then
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        Else
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        End If
                    End If
                Else
                    If Fernkampf = False And UsingWeapon > 0 And Einheit.KannNurFernkampf = False Then
                        If Frames <= FrameStart Then
                            'Die Einheit am Anfang
                            Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                            If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                            If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                                Dim Remaining As Integer = GetÜberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                                If ÜberlebendeEinheiten > Remaining Then
                                    Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                    intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                                Else
                                    intcolor = Color.FromArgb(255, 255, 255, 255)
                                End If
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        ElseIf Frames > FrameStart + FireAnimationFrames * FrameHalter Then
                            'Die Einheit steht wieder.
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                            Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                            If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                            If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        Else
                            Dim A As Integer = 0 'Hier dürften wir nie hinkommen wenn doch muss ich was ändern
                        End If
                    Else
                        Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                        If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                        If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                            Dim Remaining As Integer = GetÜberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                            If ÜberlebendeEinheiten > Remaining Then
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                        If Fernkampf = True And MoveAnimationFrames <= 0 Or Fernkampf = False And Einheit.KannNurFernkampf = True Then
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        Else
                            Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                            Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                            If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                            DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                        End If
                    End If
                End If
                ÜberlebendeEinheiten -= 1
            End While
        Else
            If Flip = False Then
                If Frames > FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter And Frames <= FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                    Dim Position As Point = EinzelUnitPosition
                    If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                    If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                    Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                    Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                    If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                    DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                ElseIf Frames > FrameStart + (MoveAnimationFrames + StoppingFrames + FireAnimationFrames) * FrameHalter Then
                    Dim Position As Point = EinzelUnitPosition
                    If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                    If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                    'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                    If Frames >= KampfAnimation.SchadensFrameAngreifer And Frames < KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 Then
                        Dim Remaining As Integer = GetÜberlebendeEinheiten(KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 + 1)
                        If Remaining < 1 Then
                            Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameAngreifer + 1)
                            intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                    Else
                        intcolor = Color.FromArgb(255, 255, 255, 255)
                    End If
                    If Fernkampf = True And MoveAnimationFrames <= 0 Then
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    Else
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    End If
                End If
            Else
                If Fernkampf = False And UsingWeapon > 0 And Einheit.KannNurFernkampf = False Then
                    If Frames <= FrameStart Then
                        'Die Einheit am Anfang
                        Dim Position As Point = EinzelUnitPosition
                        If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                        If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                            Dim Remaining As Integer = GetÜberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                            If 1 > Remaining Then
                                Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                                intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                            Else
                                intcolor = Color.FromArgb(255, 255, 255, 255)
                            End If
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    ElseIf Frames > FrameStart + FireAnimationFrames * FrameHalter Then
                        'Die Einheit steht wieder.
                        intcolor = Color.FromArgb(255, 255, 255, 255)
                        Dim Position As Point = EinzelUnitPosition
                        If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    Else
                        Dim A As Integer = 0 'Hier dürften wir nie hinkommen wenn doch muss ich was ändern
                    End If
                Else
                    Dim Position As Point = EinzelUnitPosition
                    If FlyingUnit Then Position.Y += Zufallszahl(0, 0)
                    If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
                    'Momentan gehen Tode Einheiten einfach weg hier sollten sie transparenter werden bis unsichtbar Frames 220-230
                    If Frames >= KampfAnimation.SchadensFrameVerteidiger And Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                        Dim Remaining As Integer = GetÜberlebendeEinheiten(KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 + 1)
                        If 1 > Remaining Then
                            Dim Frame As Integer = (Frames - KampfAnimation.SchadensFrameVerteidiger + 1)
                            intcolor = Color.FromArgb(255 - Frame * 25, GetUnitColor(Frame), GetUnitColor(Frame), GetUnitColor(Frame))
                        Else
                            intcolor = Color.FromArgb(255, 255, 255, 255)
                        End If
                    Else
                        intcolor = Color.FromArgb(255, 255, 255, 255)
                    End If
                    If Fernkampf = True And MoveAnimationFrames <= 0 Or Fernkampf = False And Einheit.KannNurFernkampf = True Then
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, FireAnimationFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(FireAnimation, FireAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    Else
                        Dim Ausschnitt As Point = SetBildAusschnitt(0, MoveAnimationFrames + StoppingFrames, Flip, Position, EinheitenBreite, EinheitenHöhe)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then _
                        DrawUnit(MoveAnimation, MoveAnimationMaske, sngrotation, intcolor, Spielerfarbe)
                    End If
                End If
            End If
        End If
    End Sub 'Fertig 
    Public Sub DrawMovingInAndFiring(ByVal Frames As Integer, ByVal MalStart As Point)
        If Flip = True Then
            DrawFiringAnimation(Frames, MalStart)
        Else
            DrawMovingAnimation(Frames, MalStart)
            DrawFiringAnimation(Frames, MalStart)
        End If
    End Sub 'Fertig
    Public Shared Sub DrawUnit(ByVal Textur As Texture, ByVal Maske As Texture, ByVal sngrotation As Single, ByVal intcolor As Color, ByVal Spielerfarbe As Color)
        Grafikengine.Sprite.Draw2D(Textur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
        If intcolor <> Hauptmenü.NeutralFarbe Then
            intcolor = ObjektmarkiertesFeld.getMischfarbe(intcolor, Spielerfarbe, 0.5#, False)
        Else
            intcolor = Spielerfarbe
        End If
        Grafikengine.Sprite.Draw2D(Maske, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
    End Sub 'Fertig
#End Region
#Region "Weapons"
    Public Sub DrawRakete(ByVal Frames As Integer, ByVal MalStart As Point) 'Fehlerhaft Raketen fliegen zurück. 
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        If NumberOfUnits > 1 Then
            Dim ÜberlebendeEinheiten As Integer = GetÜberlebendeEinheiten(Frames)
            While ÜberlebendeEinheiten > 0
                Frames -= ÜberlebendeEinheiten
                If Flip = False Then
                    If Frames > FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter And Frames <= KampfAnimation.SchadensFrameVerteidiger Then
                        Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                        'Raketen steigen in der Regel auf und dann ab. oder?
                        Position.X += (Frames - FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter) * 12
                        Position.Y += 8 - (Frames - FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter) * 6
                        'Jetzt wird die Rakete gestartet
                        Dim Ausschnitt As Point = SetWaffenAusschnitt(0, 2, False, False, Position, 32, 16)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height Then
                            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetWaffenAnimation(KampfGrafiken.Kampfanimation.Rakete, Flip), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                        End If
                    ElseIf Frames > KampfAnimation.SchadensFrameVerteidiger And Frames <= KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer Then
                        Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                        Position.X += (Frames - KampfAnimation.SchadensFrameVerteidiger) * 12
                        Position.X += KampfAnimation.Bildbreite - 30
                        Dim Ausschnitt As New Point
                        If OpferPosition = OpferPositionen.Oben Then
                            Position.Y = 8 - (Frames - KampfAnimation.SchadensFrameVerteidiger) * 6
                            Ausschnitt = SetWaffenAusschnitt(2, 2, False, True, Position, 32, 16)
                        Else
                            Ausschnitt = SetWaffenAusschnitt(1, 2, False, True, Position, 32, 16)
                            Position.Y = 45 + (Frames - KampfAnimation.SchadensFrameVerteidiger) * 6
                        End If
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height > 0 Then
                            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetWaffenAnimation(KampfGrafiken.Kampfanimation.Rakete, Flip), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                        End If
                    End If
                Else
                    If Frames > FrameStart Then
                        Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                        'Raketen steigen in der Regel auf und dann ab. oder?
                        Position.X += (Frames - FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter) * 12
                        Position.Y += 8 - (Frames - FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter) * 6
                        Position = FlipPoint(Position, 32)
                        'Jetzt wird die Rakete gestartet
                        Dim Ausschnitt As Point = SetWaffenAusschnitt(0, 2, Flip, False, Position, 32, 16)
                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height Then
                            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetWaffenAnimation(KampfGrafiken.Kampfanimation.Rakete, Flip), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                        End If
                    End If
                End If
                Frames += ÜberlebendeEinheiten
                ÜberlebendeEinheiten -= 1
            End While
        Else
            'Wir malen nur eine Einheit

        End If
    End Sub 'Fertig
    Public Sub DrawRaketenRauch(ByVal Frames As Integer, ByVal MalStart As Point)
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        If NumberOfUnits > 1 Then
            Dim ÜberlebendeEinheiten As Integer = GetÜberlebendeEinheiten(Frames)
            While ÜberlebendeEinheiten > 0
                Frames -= ÜberlebendeEinheiten
                If Flip = False Then
                    If Frames > FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter And Frames <= FrameStart + (MoveAnimationFrames + StoppingFrames) * FrameHalter + 8 Then
                        Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
                        'Raketen steigen in der Regel auf und dann ab. oder?
                        Position.X += 0
                        Position.Y += 0
                        'Jetzt wird die Rakete gestartet
                        Dim Frame As Integer = Math.DivRem(Frames - FrameStart - (MoveAnimationFrames + StoppingFrames) * FrameHalter, 2, 0)
                        Dim Ausschnitt As Point = SetBildAusschnitt(Frame, 3, False, Position, 70, 50)

                        Grafikengine.ptfPosition = MalStart + Position + Ausschnitt
                        If Grafikengine.recBild.Width > 0 And Grafikengine.recBild.Height Then
                            Grafikengine.Sprite.Draw2D(KampfGrafiken.GetWaffenAnimation(KampfGrafiken.Kampfanimation.RaketenRauch, Flip), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                        End If
                    End If
                Else
                End If
                Frames += ÜberlebendeEinheiten
                ÜberlebendeEinheiten -= 1
            End While
        Else

        End If
    End Sub 'Fertig
#End Region
#End Region
#Region "Berechnungen"
    Public Shared Function FlipPoint(ByVal P As Point, ByVal Einheit As ObjektEinheit) As Point
        Return FlipX(P.X, P.Y, Einheit.EinheitenID)
    End Function
    Public Shared Function FlipPoint(ByVal P As Point, ByVal Standardbreite As Integer) As Point
        Return FlipPoint(P.X, P.Y, Standardbreite)
    End Function
    Public Shared Function FlipPoint(ByVal X As Integer, ByVal Y As Integer, ByVal Standardbreite As Integer) As Point
        Return New Point(Bildbreite * 2 + 4 + X - Standardbreite, Y)
    End Function
    Public Shared Function FlipX(ByVal X As Integer, ByVal Y As Integer, ByVal Einheit As ObjektEinheit) As Point
        Return FlipX(X, Y, Einheit.EinheitenID)
    End Function
    Public Shared Function FlipX(ByVal X As Integer, ByVal Y As Integer, ByVal EinheitenID As String) As Point
        Dim Standardbreite As Integer = 0
        Select Case EinheitenID
            Case "ART", "AUFKLÄRER", "JGPZ", "JÄGER", "K-HELI", "KPZ", MovementSorts.MECH.tostring.toupper, "FLAK", "MISSILE", "RKW", "SPÄHER", _
                 "TITANPZ", "T-HELI", "SSIEINHEIT", "V3RAKETENWERFER", "FLARE", "MOTORRAD", "WASSERFLUGZEUG", _
                 "PANZERABWEHRKANONE"
                Standardbreite = 13
            Case "BOMBER", "FLTR", "KREUZER", "L-BOOT", "SCHLFF", "S-BOOT", "VERSORGUNGSSCHIFF", "ZERSTÖRER", _
                 "U-BOOT", "TRITON", "DREADNAUGHT", "S-BOMBE", "TARNK", "T-FLUGZEUG", "ZEPPELIN", "ABPZ", "HOVERFLAK", _
                 "SCHWERESHOVERCRAFT"
                Standardbreite = 8
            Case "KANONENBOOT"
                Standardbreite = 16
            Case MovementSorts.HÖLLIUM.tostring.toupper, "INF", "BAUPANZER"
                Standardbreite = 25
            Case "HOVERCRAFT"
                Standardbreite = 2
            Case "MEGAPZ", "TTP"
                Standardbreite = 20
            Case "TTL"
                Standardbreite = 55
            Case "LÄUFER"
                Standardbreite = 60
            Case Else
                Standardbreite = 13
        End Select
        Return FlipPoint(X, Y, Standardbreite)
    End Function
   
    Private Function GetÜberlebendeEinheiten(ByVal Frames As Integer) As Integer
        Dim ÜberlebendeEinheiten As Integer = 0
        Dim R As Integer
        If Flip = False Then
            If Frames < KampfAnimation.SchadensFrameAngreifer + KampfAnimation.Schadensdauer / 2 Then
                ÜberlebendeEinheiten = Math.DivRem(CInt(Einheit.Leben), 20, R)
                If R > 0 Then ÜberlebendeEinheiten += 1
            Else
                ÜberlebendeEinheiten = Math.DivRem(CInt(Einheit.Leben - Schaden), 20, R)
                If R > 0 Then ÜberlebendeEinheiten += 1
            End If
        Else
            If Frames < KampfAnimation.SchadensFrameVerteidiger + KampfAnimation.Schadensdauer / 2 Then
                ÜberlebendeEinheiten = Math.DivRem(CInt(Einheit.Leben), 20, R)
                If R > 0 Then ÜberlebendeEinheiten += 1
            Else
                ÜberlebendeEinheiten = Math.DivRem(CInt(Einheit.Leben - Schaden), 20, R)
                If R > 0 Then ÜberlebendeEinheiten += 1
            End If
        End If
        If ÜberlebendeEinheiten > 5 Then ÜberlebendeEinheiten = 5
        Return ÜberlebendeEinheiten
    End Function
    Private Function GetMaxUnit() As Integer
        Dim ÜberlebendeEinheiten As Integer = 0
        Dim R As Integer
        ÜberlebendeEinheiten = Math.DivRem(CInt(Einheit.Leben), 20, R)
        If R > 0 Then ÜberlebendeEinheiten += 1
        Return ÜberlebendeEinheiten
    End Function
    ''' <summary>
    ''' Sorgt dafür, dass die Einheit ihre aufleuchtet, wenn sie getroffen wird.=D
    ''' </summary>
    ''' <param name="Frame"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function GetUnitColor(ByVal Frame As Integer) As Integer
        'es sind ja nur 9 Frames da kann man das auch so schreiben
        Select Case Frame
            Case 0
                Return 240
            Case 1
                Return 225
            Case 2
                Return 210
            Case 3
                Return 195
            Case 4
                Return 180
            Case 5
                Return 195
            Case 6
                Return 180
            Case 7
                Return 195
            Case 8
                Return 210
            Case 9
                Return 225
            Case 10
                Return 240
            Case Else
                Return 255
        End Select
    End Function
    Public Function GetStandardPosition(ByVal ÜberlebendeEinheiten As Integer) As Point
        Dim Position As Point = New Point(XStart + ((ÜberlebendeEinheiten * 70) Mod 100), YStart - ÜberlebendeEinheiten * 17) + EinzelUnitPosition
        If Flip = True Then Position = FlipX(Position.X, Position.Y, Einheit)
        Return Position
    End Function
    ''' <summary>
    ''' Legt den Bildausschnitt für Einheiten fest.
    ''' </summary>
    ''' <param name="Frame"></param>
    ''' <param name="FrameMax"></param>
    ''' <param name="Flip"></param>
    ''' <param name="Position"></param>
    ''' <param name="Bildbreite"></param>
    ''' <param name="Bildhöhe"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function SetBildAusschnitt(ByVal Frame As Integer, ByVal FrameMax As Integer, ByVal Flip As Boolean, ByVal Position As Point, ByVal Bildbreite As Integer, ByVal Bildhöhe As Integer) As Point
        Dim Ausschnitt As New Point(0, 0)
        Dim GesamtBildbreite As Integer = (Frame + 1) * Bildbreite
        Dim BildX As Integer = Frame * Bildbreite
        If Flip = True Then
            With Grafikengine.recBild
                .X = Frame * Bildbreite : .Width = Bildbreite
                .Y = 0 : .Height = Bildhöhe
            End With
            If Position.X > KampfAnimation.Bildbreite * 2 + 4 Then
                Grafikengine.recBild.X += (Position.X - KampfAnimation.Bildbreite * 2 + 4)
                Grafikengine.recBild.Width -= (Position.X - KampfAnimation.Bildbreite * 2 + 4)
                Ausschnitt.X -= (Position.X - KampfAnimation.Bildbreite * 2 + 4)
            End If
            If Position.X - Grafikengine.recBild.Width < KampfAnimation.Bildbreite + 4 Then
                If Grafikengine.recBild.Width > KampfAnimation.Bildbreite Then
                    Grafikengine.recBild.X = Grafikengine.recBild.Width - KampfAnimation.Bildbreite
                    Grafikengine.recBild.Width = KampfAnimation.Bildbreite
                    Ausschnitt.X += Grafikengine.recBild.X
                Else
                    Grafikengine.recBild.Width -= (KampfAnimation.Bildbreite + 4 - (Position.X - Grafikengine.recBild.Width))
                End If
            End If
            'Y Ausschnitt ist immer gleich
            If Position.Y < 0 Then
                Grafikengine.recBild.Y -= Position.Y
                Ausschnitt.Y -= Position.Y
            End If
            If Position.Y + Bildhöhe > KampfAnimation.BildHöhe Then
                Grafikengine.recBild.Height -= Position.Y + Bildhöhe - KampfAnimation.BildHöhe
            End If
            'jetzt wird die Textur noch gespiegelt
            Grafikengine.szfScale = New Size(-Grafikengine.recBild.Width, Grafikengine.recBild.Height)
            Ausschnitt.X += 8
        Else
            Grafikengine.szfScale = Nothing
            With Grafikengine.recBild
                .X = Frame * Bildbreite : .Width = Bildbreite
                .Y = 0 : .Height = Bildhöhe
            End With
            If Position.X < 0 Then
                Grafikengine.recBild.X -= Position.X
                Grafikengine.recBild.Width += Position.X
                Ausschnitt.X -= Position.X
            End If
            If Position.X + Grafikengine.recBild.Width > KampfAnimation.Bildbreite Then
                Grafikengine.recBild.Width -= Position.X + Grafikengine.recBild.Width - KampfAnimation.Bildbreite
            End If
            'Y Ausschnitt ist immer gleich
            If Position.Y < 0 Then
                Grafikengine.recBild.Y -= Position.Y
                Ausschnitt.Y -= Position.Y
            End If
            If Position.Y + Bildhöhe > KampfAnimation.BildHöhe Then
                Grafikengine.recBild.Height -= Position.Y + Bildhöhe - KampfAnimation.BildHöhe
            End If
        End If

        'Breite Überprüfen
        If Grafikengine.recBild.Width < 0 Then
            Grafikengine.recBild.Width = 0
        ElseIf Grafikengine.recBild.Width > Bildbreite Then
            Grafikengine.recBild.Width = 0
        End If
        'Höhe überprüfen
        If Grafikengine.recBild.Height < 0 Then
            Grafikengine.recBild.Height = 0
        ElseIf Grafikengine.recBild.Height > Bildhöhe Then
            Grafikengine.recBild.Height = 0
        End If
        'X Überprüfen
        If Grafikengine.recBild.X > GesamtBildbreite Then
            Grafikengine.recBild.X = 0
            Grafikengine.recBild.Width = 0
        ElseIf Grafikengine.recBild.X < BildX Then
            Grafikengine.recBild.X = 0
            Grafikengine.recBild.Width = 0
        End If
        'YÜberprüfen
        If Grafikengine.recBild.Y < 0 Then
            Grafikengine.recBild.Y = 0
            Grafikengine.recBild.Height = 0
        ElseIf Grafikengine.recBild.Y > Bildhöhe Then
            Grafikengine.recBild.Y = 0
            Grafikengine.recBild.Height = 0
        End If
        Return Ausschnitt
    End Function
    ''' <summary>
    ''' Legt den Bildausschnitt für Waffen fest
    ''' </summary>
    ''' <param name="Frame"></param>
    ''' <param name="FrameMax"></param>
    ''' <param name="Flip"></param>
    ''' <param name="BeimGegner"></param>
    ''' <param name="Position"></param>
    ''' <param name="Bildbreite"></param>
    ''' <param name="Bildhöhe"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function SetWaffenAusschnitt(ByVal Frame As Integer, ByVal FrameMax As Integer, ByVal Flip As Boolean, ByVal BeimGegner As Boolean, ByVal Position As Point, ByVal Bildbreite As Integer, ByVal Bildhöhe As Integer) As Point
        Dim Ausschnitt As New Point()
        Dim GesamtBildbreite As Integer = (Frame + 1) * Bildbreite
        Dim BildX As Integer = Frame * Bildbreite
        If Flip = True Then
            If BeimGegner = True Then
                Position.X += (KampfAnimation.Bildbreite + 4)
                With Grafikengine.recBild
                    .X = Frame * Bildbreite : .Width = Bildbreite
                    .Y = 0 : .Height = Bildhöhe
                End With
                If Position.X > KampfAnimation.Bildbreite * 2 + 4 Then
                    Grafikengine.recBild.X += (Position.X - KampfAnimation.Bildbreite * 2 + 4)
                    Grafikengine.recBild.Width -= (Position.X - KampfAnimation.Bildbreite * 2 + 4)
                    Ausschnitt.X -= (Position.X - KampfAnimation.Bildbreite * 2 + 4)
                End If
                If Position.X - Grafikengine.recBild.Width < KampfAnimation.Bildbreite + 4 Then
                    Grafikengine.recBild.Width -= ((KampfAnimation.Bildbreite + 4) - (Position.X - Grafikengine.recBild.Width))
                End If
                'Y Ausschnitt ist immer gleich
                If Position.Y < 0 Then
                    Grafikengine.recBild.Y -= Position.Y
                    Ausschnitt.Y -= Position.Y
                End If
                If Position.Y + Bildhöhe > KampfAnimation.BildHöhe Then
                    Grafikengine.recBild.Height -= Position.Y + Bildhöhe - KampfAnimation.BildHöhe
                End If
                'jetzt wird die Textur noch gespiegelt
                Grafikengine.szfScale = New Size(-Grafikengine.recBild.Width, Grafikengine.recBild.Height)
                Ausschnitt.X += 8
            Else
                With Grafikengine.recBild
                    .X = Frame * Bildbreite : .Width = Bildbreite
                    .Y = 0 : .Height = Bildhöhe
                End With
                If Position.X > KampfAnimation.Bildbreite * 2 + 4 Then
                    Grafikengine.recBild.X += (Position.X - KampfAnimation.Bildbreite * 2 + 4)
                    Grafikengine.recBild.Width -= (Position.X - KampfAnimation.Bildbreite * 2 + 4)
                    Ausschnitt.X -= (Position.X - KampfAnimation.Bildbreite * 2 + 4)
                End If
                If Position.X - Grafikengine.recBild.Width < KampfAnimation.Bildbreite + 4 Then
                    Grafikengine.recBild.Width -= ((KampfAnimation.Bildbreite + 4) - (Position.X - Grafikengine.recBild.Width))
                End If
                'Y Ausschnitt ist immer gleich
                If Position.Y < 0 Then
                    Grafikengine.recBild.Y -= Position.Y
                    Ausschnitt.Y -= Position.Y
                End If
                If Position.Y + Bildhöhe > KampfAnimation.BildHöhe Then
                    Grafikengine.recBild.Height -= Position.Y + Bildhöhe - KampfAnimation.BildHöhe
                End If
                'jetzt wird die Textur noch gespiegelt
                Grafikengine.szfScale = New Size(-Grafikengine.recBild.Width, Grafikengine.recBild.Height)
                Ausschnitt.X += 8
            End If
        Else
            If BeimGegner = True Then
                Position.X -= (KampfAnimation.Bildbreite + 4)
                Grafikengine.szfScale = Nothing
                With Grafikengine.recBild
                    .X = Frame * Bildbreite : .Width = Bildbreite
                    .Y = 0 : .Height = Bildhöhe
                End With
                If Position.X < 0 Then
                    Grafikengine.recBild.X -= Position.X
                    Grafikengine.recBild.Width += Position.X
                    Ausschnitt.X -= Position.X
                End If
                If Position.X + Grafikengine.recBild.Width > KampfAnimation.Bildbreite Then
                    Grafikengine.recBild.Width -= Position.X + Grafikengine.recBild.Width - KampfAnimation.Bildbreite
                End If
                'Y Ausschnitt ist immer gleich
                If Position.Y < 0 Then
                    Grafikengine.recBild.Y -= Position.Y
                    Ausschnitt.Y -= Position.Y
                End If
                If Position.Y + Bildhöhe > KampfAnimation.BildHöhe Then
                    Grafikengine.recBild.Height -= Position.Y + Bildhöhe - KampfAnimation.BildHöhe
                End If
            Else
                Grafikengine.szfScale = Nothing
                With Grafikengine.recBild
                    .X = Frame * Bildbreite : .Width = Bildbreite
                    .Y = 0 : .Height = Bildhöhe
                End With
                If Position.X < 0 Then
                    Grafikengine.recBild.X -= Position.X
                    Grafikengine.recBild.Width += Position.X
                    Ausschnitt.X -= Position.X
                End If
                If Position.X + Grafikengine.recBild.Width > KampfAnimation.Bildbreite Then
                    Grafikengine.recBild.Width -= Position.X + Grafikengine.recBild.Width - KampfAnimation.Bildbreite
                End If
                'Y Ausschnitt ist immer gleich
                If Position.Y < 0 Then
                    Grafikengine.recBild.Y -= Position.Y
                    Ausschnitt.Y -= Position.Y
                End If
                If Position.Y + Bildhöhe > KampfAnimation.BildHöhe Then
                    Grafikengine.recBild.Height -= Position.Y + Bildhöhe - KampfAnimation.BildHöhe
                End If
            End If
        End If
        'Breite Überprüfen
        If Grafikengine.recBild.Width < 0 Then
            Grafikengine.recBild.Width = 0
        ElseIf Grafikengine.recBild.Width > Bildbreite Then
            Grafikengine.recBild.Width = 0
        End If
        'Höhe überprüfen
        If Grafikengine.recBild.Height < 0 Then
            Grafikengine.recBild.Height = 0
        ElseIf Grafikengine.recBild.Height > Bildhöhe Then
            Grafikengine.recBild.Height = 0
        End If
        'X Überprüfen
        If Grafikengine.recBild.X > GesamtBildbreite Then
            Grafikengine.recBild.X = 0
            Grafikengine.recBild.Width = 0
        ElseIf Grafikengine.recBild.X < BildX Then
            Grafikengine.recBild.X = 0
            Grafikengine.recBild.Width = 0
        End If
        'YÜberprüfen
        If Grafikengine.recBild.Y < 0 Then
            Grafikengine.recBild.Y = 0
            Grafikengine.recBild.Height = 0
        ElseIf Grafikengine.recBild.Y > Bildhöhe Then
            Grafikengine.recBild.Y = 0
            Grafikengine.recBild.Height = 0
        End If
        Return Ausschnitt
    End Function
#End Region
#Region "Einheiten"
    ''' <summary>
    ''' Stellt die Grafiken eines Kampfpanzers dar.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationKampfPanzer
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            MovingSteps = 7
            If Waffe = 1 Then
                FireAnimationFrames = 5
            Else
                FireAnimationFrames = 6
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            If Fernkampf Then
                DrawStandingAnimation(Frames, MalStart)
            Else
                DrawMovingInAndFiring(Frames, MalStart)
            End If
        End Sub
    End Class
    ''' <summary>
    ''' Stellt die Grafiken eines Raketenwerfer dar.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationRaketenwerfer
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            If Waffe = 2 Then
                FireAnimationFrames = 2
            End If
            If Flip = False Then
                'wir sind der Angreifer
                FrameStart = 70
                KampfAnimation.SchadensFrameVerteidiger = FrameStart + FireAnimationFrames * FrameHalter
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            DrawRakete(Frames, MalStart)
            DrawMovingInAndFiring(Frames, MalStart)
            DrawRaketenRauch(Frames, MalStart)
        End Sub
    End Class
    ''' <summary>
    ''' Ein TTP.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationTTP
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, -1, 130, Fernkampf, OpferPosition)
            If Waffe = 2 Then
                FireAnimationFrames = 0
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            If Fernkampf Then
                DrawStandingAnimation(Frames, MalStart)
            Else
                DrawMovingInAndFiring(Frames, MalStart)
            End If

        End Sub
    End Class
    ''' <summary>
    ''' Diese Klasse stellt eine Infanterie Animation her!
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationInfanterie
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            MovingSteps = 3
            If Waffe = 1 Then
                FireAnimationFrames = 6
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            If Fernkampf Then
                DrawStandingAnimation(Frames, MalStart)
            Else
                DrawMovingInAndFiring(Frames, MalStart)
            End If
        End Sub
    End Class
    ''' <summary>
    ''' Diese Klasse stellt eine Mech Animation her!
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationMech
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            MovingSteps = 3
            If Waffe = 1 Then
                Dim Anim As Objektverwalter.Kampfanimation = Objektverwalter.AlleEinheiten(Attacker.BildID).GetKampfAnimation(Attacker.GetSpieler.Armee)
                MoveAnimation = Anim.Bewegungstextur
                MoveAnimationMaske = Anim.BewegungstexturMaske

                FireAnimationFrames = 6
                MoveAnimationFrames = 12
            Else
                MoveAnimationFrames = 12
                FireAnimationFrames = 5
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            If Fernkampf Then
                DrawStandingAnimation(Frames, MalStart)
            Else
                DrawMovingInAndFiring(Frames, MalStart)
            End If
        End Sub
    End Class
    ''' <summary>
    ''' Stellt die Grafiken eines Jagdpanzers dar.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationJagdpanzer
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            MovingSteps = 7
            If Waffe = 1 Then
                FireAnimationFrames = 5
            Else
                FireAnimationFrames = 5
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            If Fernkampf Then
                DrawStandingAnimation(Frames, MalStart)
            Else
                DrawMovingInAndFiring(Frames, MalStart)
            End If
        End Sub
    End Class
    ''' <summary>
    ''' Stellt die Grafiken eines Jagdpanzers dar.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationSpäher
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            MovingSteps = 7
            If Waffe = 1 Then
                FireAnimationFrames = 5
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            If Fernkampf Then
                DrawStandingAnimation(Frames, MalStart)
            Else
                DrawMovingInAndFiring(Frames, MalStart)
            End If
        End Sub
    End Class
    ''' <summary>
    ''' Stellt die Grafiken eines Raketenwerfer dar.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationArtillerie
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            If Waffe = 2 Then
                FireAnimationFrames = 8
            End If
            If Flip = False Then
                'wir sind der Angreifer
                FrameStart = 70
                KampfAnimation.SchadensFrameVerteidiger = FrameStart + (FireAnimationFrames + StoppingFrames + MoveAnimationFrames) * FrameHalter + 25
            End If
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            DrawMovingInAndFiring(Frames, MalStart)
        End Sub
    End Class
    ''' <summary>
    ''' Stellt die Grafiken eines Flak dar.
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationFlak
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, Waffe, 130, Fernkampf, OpferPosition)
            MovingSteps = 6
            Dim S As String = Attacker.GetSpieler.Armee
            Select Case OpferPosition
                Case OpferPositionen.Oben
                    FireAnimation = Objektverwalter.AlleEinheiten(Attacker.BildID).GetKampfAnimation(S).KampfanimationWaffe1
                    FireAnimationMaske = Objektverwalter.AlleEinheiten(Attacker.BildID).GetKampfAnimation(S).KampfanimationWaffe1Maske
                Case Else
                    FireAnimation = Objektverwalter.AlleEinheiten(Attacker.BildID).GetKampfAnimation(S).KampfanimationWaffe2
                    FireAnimationMaske = Objektverwalter.AlleEinheiten(Attacker.BildID).GetKampfAnimation(S).KampfanimationWaffe2Maske
            End Select
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            If Fernkampf Then
                DrawStandingAnimation(Frames, MalStart)
            Else
                DrawMovingInAndFiring(Frames, MalStart)
            End If
        End Sub
    End Class

    ''' <summary>
    ''' Für alle Truppen wo wir nichts haben
    ''' </summary>
    ''' <remarks></remarks>
    Private Class EinheitenAnimationDefault
        Inherits EinheitenAnimation
        Public Sub New(ByVal Attacker As ObjektEinheit, ByVal Damage As Single, ByVal Waffe As Integer, ByVal Flip As Boolean, ByVal Fernkampf As Boolean, ByVal OpferPosition As OpferPositionen)
            MyBase.New(Attacker, Flip, Damage, -1, 130, Fernkampf, OpferPosition)
            FireAnimationFrames = 0
            MoveAnimationFrames = 0
            StoppingFrames = 0
        End Sub
        Public Overrides Sub Malen(ByVal Frames As Integer, ByVal MalStart As System.Drawing.Point)
            If Fernkampf Then
                DrawStandingAnimation(Frames, MalStart)
            Else
                DrawMovingInAndFiring(Frames, MalStart)
            End If
        End Sub
    End Class
#End Region
End Class